博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
乐观锁和悲观锁
阅读量:4968 次
发布时间:2019-06-12

本文共 1108 字,大约阅读时间需要 3 分钟。

乐观锁和悲观锁

0.锁

并行会导致冲突,冲突需要解决,于是就有了锁。

 

1.悲观锁

悲观锁,pessimistic lock,每次拿数据的时候都认为别人会修改,所以在每次拿数据的时候都会上锁,这样别人想拿这个数据就会block,直到它拿到锁。传统的关系数据库里用到了很多这种锁的机制。

意如其名,悲观锁具有强烈的独占和排他特性。悲观锁的实现,往往依靠数据库提供的锁机制,同时,也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,及时在本系统中实现了加锁机制,也无法保证外部系统不会修改数据。

下面是一个典型的依赖数据库的悲观锁调用:

1 select * from account where name="Erica" for update

 

这条sql锁定了account表中所有符合where条件的记录,在本次事务提交之前,外界无法修改这些记录。

2.乐观锁

乐观锁,optimistic lock,每次拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

乐观锁的实现是在数据库表加上version版本号的字段,每次修改数据都对version+1,当两个更改请求同时到达数据库,A取到version=1,然后对数据进行修改,修改后将version+1=2写入数据库,此时数据库里的version=1,写入的version大于数据库里的version,乐观锁就认为可以写入,数据库的version被更新为2,;  此时B取到的version也是1,然后对数据修改,修改后version+1=2写入数据库,写入时和数据库的version比对,发现version=2,没有大于数据库中现存的版本号,于是拒绝写入。

乐观锁一般是在应用层实现,在数据库层的代码如下:

 

UPDATE activity_question SET z_index=#{status}, version=version+1 WHERE id=#{questionId} AND version=#{version}

  

3.何时使用

乐观锁适用于多读的应用类型,可以提高吞吐量,

乐观锁适用于写比较少的情况,这样可以省去锁的开销,加大系统的吞吐量。

但是如果经常产生冲突,上层应用就会不断地重试,这样就降低了性能,这种情况下悲观锁就比较合适。

转载于:https://www.cnblogs.com/AaronCui/p/4904522.html

你可能感兴趣的文章
网络流---最大流(Edmond-Karp算法)的学习
查看>>
jvm(13)-线程安全与锁优化
查看>>
网络流24题——太空飞行计划问题(最大权闭合图)
查看>>
HTTP状态码
查看>>
RunLoop(运行循环)-002-加载大图
查看>>
eclipse中修改tomcat的配置,解决全局性的get提交乱码问题
查看>>
UI: 使用 UIViewController 展现和管理视图
查看>>
编译器会强制没有数据成员的对象长度非零
查看>>
二叉树深度
查看>>
六种方式读取properties资源文件
查看>>
gradient css
查看>>
构建之法阅读笔记03
查看>>
合并两个排序的链表
查看>>
SQL语言之概述(一)
查看>>
数据库表 copy
查看>>
LinkedList源码解析
查看>>
SignalR循序渐进(一)简单的聊天程序
查看>>
MyServer
查看>>
Learning Cocos2d-x for XNA(2)——深入剖析Hello World
查看>>
软件建模——第9章 毕业论文管理系统—面向对象方法
查看>>