课程咨询 :136-6976-6643

长沙Java培训 > 达内新闻 > 解析:并发控制之乐观锁
  • 解析:并发控制之乐观锁

    发布:长沙web培训      来源:Importnew.com      时间:2016-08-11

  • 上一篇文章中,达内长沙java培训的老师为大家讲解了悲观锁。那么这篇文章,让我们一起分析一下乐观锁吧。

    在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最早是由孔祥重(H.T.Kung)教授提出。

    乐观锁(Optimistic Locking) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

    相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

    数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

    实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。

    使用版本号实现乐观锁:

    使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新的版本号。

    1.查询出商品信息

    select (status,status,version) from t_goods where id=#{id}

    2.根据商品信息生成订单

    3.修改商品status为2

    update t_goods

    set status=2,version=version+1

    where id=#{id} and version=#{version};

    优点与不足:

    乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题。

    推荐文章

上一篇:解析:并发控制之悲观锁

下一篇:如何对代码质量进行测试

最新开班日期  |  更多

Java--大数据业余制班

Java--大数据业余制班

开班日期:3月31日

Java--大数据全日制班

Java--大数据全日制班

开班日期:3月31日

Java--零基础业余班

Java--零基础业余班

开班日期:3月31日

Java--零基础全日制班

Java--零基础全日制班

开班日期:3月31日

  • 网址:http://cs.java.tedu.cn     地址:长沙市雨花区芙蓉中路二段359号佳天国际新城北栋28楼
  • 课程培训电话:136-6976-6643     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56