关闭

排它锁,共享锁,乐观锁,排它锁

808人阅读 评论(0) 收藏 举报
分类:
1.共享锁只用于表级,排他锁用于行级。
2.加了共享锁的对象,可以继续加共享锁,不能再加排他锁。加了排他锁后,不能再加任何锁。
3.比如一个DML操作,就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL的操作。
4.当执行DDL操作时,就需要在全表上加排他锁
 
为什么需要锁(并发控制)?
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
典型的冲突有:
 
l 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
 
l 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户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)选项,在查询记录的时候我们就对记录加上了更新锁,表示我们即将对此记录进行更新. 注意更新锁和共享锁是不冲突的,也就是其他用户还可以查询此表的内容,但是和更新锁和排它锁是冲突的.所以其他的更新用户就会阻塞.
结论
在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法.
参考文档
[2] Oracle的悲观锁和乐观锁http://space.itpub.net/12158104/viewspace-374745
[3] timestamp应用——乐观锁和悲观锁【转】http://hi.baidu.com/piaokes/blog/item/9b0c6854e4909050564e00b3.html
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

共享锁和排他锁

共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数...
  • DreamLLOver
  • DreamLLOver
  • 2016-06-03 11:18
  • 3684

共享锁和排它锁(ReentrantReadWriteLock)

1、什么是共享锁和排它锁      共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。      排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释...
  • yanlinwang
  • yanlinwang
  • 2014-11-16 14:27
  • 8623

初步了解更新锁(U)与排它锁(X)

一直没有认真觉察UPDATE操作的锁,最近在MSDN上看到一个问题,询问堆表更新的死锁问题,问题很简单,有类似这样的表及数据:CREATE TABLE dbo.tb(     c1 int,     ...
  • zjcxc
  • zjcxc
  • 2014-05-28 17:13
  • 14009

共享锁与排它锁

共享锁【S锁】 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前...
  • p10010
  • p10010
  • 2015-12-13 15:11
  • 1807

共享锁(S锁)和排它锁(X锁)

共享锁【S锁】又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能...
  • yuwei19840916
  • yuwei19840916
  • 2008-11-07 10:53
  • 26981

对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

记得在上大学那会开始,在大学的课堂上,常常会听到老师讲什么共享锁,排它锁各种锁的词汇,以前仅仅听过一次就没有管了,并没有进行深入的研究 最近,在各种群里,又看见了什么乐观锁、悲观锁什么鬼的感觉很高级的...
  • puhaiyang
  • puhaiyang
  • 2017-05-16 17:26
  • 3410

共享锁与排它锁区别

共享锁【S锁】 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前...
  • guobangli
  • guobangli
  • 2014-02-13 19:11
  • 1970

hibernate 锁

业务实现过程中,难免需要保证数据访问的排他性。如两个事务同时判断条件成立,都进行数据插入的情况,这时我们就需要依赖锁机制来解决这种条件同时成立的情况。Hibernate 支持两种锁机制:悲观锁(Pes...
  • pingnanlee
  • pingnanlee
  • 2015-05-27 09:28
  • 1200

详解Hibernate中的事务

1.前言 上一篇博客讲解了Hibernate中的一级缓存,属于Session级别的,这篇博客讲解一下Hibernate中的事务机制。有关事务的概念,请参照通俗易懂数据库中的事务。  2.如何处...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015-08-18 10:30
  • 3213

对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

记得在上大学那会开始,在大学的课堂上,常常会听到老师讲什么共享锁,排它锁各种锁的词汇,以前仅仅听过一次就没有管了,并没有进行深入的研究 最近,在各种群里,又看见了什么乐观锁、悲观锁什么鬼的感觉很高级的...
  • puhaiyang
  • puhaiyang
  • 2017-05-16 17:26
  • 3410
    个人资料
    • 访问:81865次
    • 积分:2314
    • 等级:
    • 排名:第18698名
    • 原创:121篇
    • 转载:123篇
    • 译文:0篇
    • 评论:14条
    最新评论