为什么需要锁(并发控制)?
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
典型的冲突有:
1 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
2 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。
为了解决这些并发带来的问题。 我们需要引入并发控制机制。
并发控制机制
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。[1]
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。[1] 乐观锁不能解决脏读的问题。
乐观锁应用
1. 使用自增长的整数表示数据版本号。更新时检查版本号是否一致,比如数据库中数据版本为6,更新提交时version=6+1,使用该version值(=7)与数据库version+1(=7)作比较,如果相等,则可以更新,如果不等则有可能其他程序已更新该记录,所以返回错误。
2. 使用时间戳来实现.
注:对于以上两种方式,
Hibernate自带实现方式:在使用乐观锁的字段前加annotation: @Version, Hibernate在更新时自动校验该字段。
悲观锁应用
需要使用数据库的锁机制,比如SQL SERVER 的TABLOCKX(排它表锁) 此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
SqlServer中使用
Begin Tran
select top 1 @TrainNo=T_NO
from Train_ticket with (UPDLOCK) where S_Flag=0
update Train_ticket
set T_Name=user,
T_Time=getdate(),
S_Flag=1
where T_NO=@TrainNo
commit
我们在查询的时候使用了with (UPDLOCK)选项,在查询记录的时候我们就对记录加上了更新锁,表示我们即将对此记录进行更新. 注意更新锁和共享锁是不冲突的,也就是其他用户还可以查询此表的内容,但是和更新锁和排它锁是冲突的.所以其他的更新用户就会阻塞.
结论
在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法.
参考文档
[1]Concurrent Control http://en.wikipedia.org/wiki/Concurrency_control
[2] Oracle的悲观锁和乐观锁http://space.itpub.net/12158104/viewspace-374745
[3] timestamp应用——乐观锁和悲观锁
分享到:
相关推荐
主要介绍了thinkPHP框架乐观锁和悲观锁,结合实例形式分析了框架乐观锁和悲观锁的原理及thinkPHP相关实现技巧,需要的朋友可以参考下
介绍数据库事务的定义和事务带来的问题,详细讲解乐观锁与悲观锁的区别
Hibernate的乐观锁与悲观锁的文档,帮助学习Hibernate的乐观锁与悲观锁,让你们学得更轻松。
详细介绍了Oracle中乐观锁、悲观锁的原理及应用,并有实例
Hibernate乐观锁和悲观锁分析,针对在使用HIBERNATE时怎么配置乐观锁进行了详细的范例讲解
面试必备之乐观锁与悲观锁.pdf
[数据库事务与锁]详解七 深入理解乐观锁与悲观锁
其中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式...
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部 系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状 态。悲观锁的实现,往往依靠数据库提供的锁机制...
p278 - p288 乐观锁和悲观锁
hibernate的乐观锁和悲观锁,两种锁搞定一切
java,乐观锁,悲观锁详解释
主要介绍了SpringBoot整合MyBatis实现乐观锁和悲观锁的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
并发控制—悲观锁和乐观锁
各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等
面试必备之乐观锁与悲观锁.zip
Java 中的悲观锁和乐观锁的实现 纯开发技巧。
面试必备之乐观锁与悲观锁.pdf
共享锁,更新锁,乐观锁,悲观锁 和 数据库中锁的使用
面试必备之乐观锁与悲观锁