乐观锁和悲观锁的简单实现
数据库表:seckill
乐观锁:
乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
即很乐观,查询数据的时候总觉得不会有人更改数据,等到更新的时候再判断这个数据有没有被人更改,有人更改了则本次更新失败。
优点:乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。
缺点:由于乐观锁机制是在我们的系统中实现,来自外部系统的number更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。
样例:
UPDATE seckill SET number=number-1,version=version+1 WHERE seckill_id=1000 AND version = 0
悲观锁:
根据命名即对数据进行操作更新时,对操作持悲观保守的态度,认为产生数据冲突的可能性很大,需要先对请求的数据加锁再进行相关的操作。实现方式:通过数据库锁机制实现,即对查询语句添加for update关键字。
即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录锁掉,这样别人就没法改这条数据了,一直到你的锁释放。
优点:每一次行数据的访问都是独占的,只有当正在访问该行数据的请求事务提交以后,其他请求才能依次访问该数据,否则将阻塞等待锁的获取。悲观锁可以严格保证数据访问的安全。
缺点:每次请求都会额外产生加锁的开销且未获取到锁的请求将会阻塞等待锁的获取,在高并发环境下,容易造成大量请求阻塞,影响系统可用性。另外,悲观锁使用不当还可能产生死锁的情况。
样例:
SELECT number FROM seckill WHERE seckill_id=1001 FOR UPDATE;
UPDATE seckill SET number=number-1 WHERE seckill_id=1001;
并发量较小、又需要独占读取结果并依赖读取的结果进行判断的业务场景比较适合使用悲观锁。
乐观锁和悲观锁的简单实现相关推荐
- 乐观锁和悲观锁的简单理解
乐观锁和悲观锁的简单理解 一.悲观锁 每次读取数据时认为其他线程会修改这个数据,所以每次读的时候都会加锁,实现悲观锁需要使用数据库的锁机制 1.共享锁 2.排他锁 3.行锁 ① 共享锁 共享锁也称为S ...
- 乐观锁、悲观锁简单分析,回忆旧(新)知识...
2019独角兽企业重金招聘Python工程师标准>>> 今天被人问了下乐观锁和悲观锁,突然在脑子里好模糊,但又感觉以前很熟悉的东西竟然忘得这么干净.所以恶补加记录一下. 乐观锁和悲观 ...
- [初级]深入理解乐观锁与悲观锁
2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...
- [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...
- 乐观锁和悲观锁,可重入锁和不可重入锁(1)
乐观锁和悲观锁,可重入锁和不可重入锁(1) 前言 感觉有一段时间没有写博客了呢.还是再接再厉吧,适当程度的总结能让我自己能够更加深入地巩固和理解自己所学习的一切. 还有,我很懒,而且我还是比较喜欢写日 ...
- 深入理解乐观锁与悲观锁
在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...
- **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...
推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...
- 数据库并发控制,选择乐观锁还是悲观锁?
出处:http://www.cnblogs.com/chenlulouis/ 今天,在这里,我们将讨论的是在实际生产过程中,对于并发控制你是选择乐观锁还是悲观锁.这两种锁各自的应用环境应该怎样选择? ...
- 数据库中的乐观锁与悲观锁详解
目录 悲观锁 乐观锁 悲观锁实现方式 乐观锁实现方式 如何选择 悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借 ...
- 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理
共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...
最新文章
- 面试官:关于负载均衡你了解多少
- 通过padding-bottom或者padding-top实现等比缩放响应式图片
- deepin安装windows虚拟机_Deepin Linux V20系统通过安装wine实现运行windows程序
- mysql时区代码_mysql时区设置为东八区
- 数学建模 ---斯皮尔曼相关系数
- IEC 60664-1-2020【现行】低压供电系统内设备的绝缘配合第1部分:原则、要求和试验
- cocos2d-js 3.0 ios平台编译打包
- IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
- 干货!因果推理的应用与发展 | PhD Debate-7
- 基础SQL语法及使用(入门级)
- 超强锁SuperPro
- 动态内存分配(详解)
- Halide学习笔记----Halide tutorial源码阅读5
- redis哨兵搭建(windows)
- 人力资源管理系统 | 人事管理系统--毕业设计03
- 安装运行Hyperf
- 电力系统中惯量和阻尼的分类以及两者不足的危害
- 如何衡量OA系统的质量问题
- python是一种解释型面向_Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。...
- join ... on.... [and] 的理解
热门文章
- keil安装与汇编调试
- 如何给table里的input赋值
- 前端开发中,js时间与时间戳的转换
- 计算机word考试试题学做,全国计算机等级考试Word试题及答案
- 直接更改maven的settings设置jdk版本
- 黄褐斑的食疗用什么,姬净美效果不错
- 实用:用深度学习方法修复医学图像数据集
- JavaScript(订单的增删改)
- mysql系统设计论文_毕业论文管理系统的设计与实现(MyEclipse,MySQL)
- Python输入一个字符串,输出其中每个字符的出现次数。要求使用标准库collotections中的Counter类...