概念
可重入
获得锁的程序因为断网等原因离开后可以重入
锁的实现
1 乐观锁
通过版本字段手动实现,适用写少的场景
写多的冲突多了不断重试反倒低性能
冲突率<20%时使用,重试次数>=3
update …
set … version=version+1
where id=#{id} and version=#{version};
2 悲观锁
无版本字段,其他可读不可改,分两种
2.1 共享锁
其他共享锁可以SELECT进来
SELECT … lock in share mode;
2.2 排他锁
共享锁悲观锁都不能SELECT进来
SELECT … for update;
分两种
2.2.1 行锁
使用索引
exists
SELECT … FORCE INDEX WHERE …
2.2.2 表锁
全表扫描
in
死锁
死锁条件
互斥排他
保持着排他资源又提出新资源请求
不可剥夺
环路
死锁避免
同顺序
一次性锁定
细粒度锁定(行锁)
网友评论