乐观锁以及乐观锁的实现
来源:互联网 发布:加热脚垫淘宝 编辑:程序博客网 时间:2024/04/28 18:34
原文地址:http://blog.csdn.net/lululove19870526/article/details/51899934。
一、为什么需要锁(并发控制)?
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
典型的冲突有:
1.丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
2.脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。
为了解决这些并发带来的问题。 我们需要引入并发控制机制。
二、 并发控制机制
锁,即给我们选定的目标数据上锁,使其无法被其他程序修改。
1.悲观锁:指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态
2.乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。
三、乐观锁的实现
使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据
1.数据库表设计
task
有三个字段,分别是id,value、version
2.实现
1)先读task表的数据(实际上这个表只有一条记录),得到version的值为versionValue
2)每次更新task表中的value字段时,为了防止发生冲突,需要这样操作
update task set value = newValue,version = versionValue + 1 where version = versionValue;
只有这条语句执行了,才表明本次更新value字段的值成功
如假设有两个节点A和B都要更新task表中的value字段值,差不多在同一时刻,A节点和B节点从task表中读到的version值为2,那么A节点和B节点在更新value字段值的时候,都操作 update task set value = newValue,version = 3 where version = 2;,实际上只有1个节点执行该SQL语句成功,假设A节点执行成功,那么此时task表的version字段的值是3,B节点再操作update task set value = newValue,version = 3 where version = 2;这条SQL语句是不执行的,这样就保证了更新task表时不发生冲突
- 乐观锁以及乐观锁的实现
- 乐观锁以及乐观锁的实现
- 乐观锁以及乐观锁的实现
- J.U.C--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
- Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
- 乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
- mysql 乐观锁和悲观锁的区别,以及乐观锁实现
- activiti乐观锁实现
- mysql 乐观锁实现
- CAS:乐观锁实现
- mysql的乐观锁,以及注释<![CDATA[]]>
- 乐观的人用乐观锁?
- redis 事务以及乐观锁
- 乐观锁的作用
- 程序中的乐观锁与悲观锁,以及动手实现乐观锁
- 程序中的乐观锁与悲观锁,以及动手实现乐观锁 (转)
- 悲观锁和乐观锁的实现
- 乐观锁与悲观锁的实现
- mybatis中的#{}与${}的区别
- 理解*ptr++
- 织梦dedecms栏目页如何添加数字递增 数字123456
- 禁止root用户ssh登录机器
- extjs中renderer的使用方法
- 乐观锁以及乐观锁的实现
- python——MTM动力指标
- Activity全方位了解,总有你不知道的一面
- web.xml详解
- 裁剪UIImage 裁剪图片得到裁剪区域图片
- spring框架
- move_base配置参数
- chapter2- 概率模型限制条件
- Android之判断手机连接的网络类型是WIFI还是2G/3G/4G