知识卡片
悲观离线锁的三种类型:独占写锁/独占读锁/读写锁
内容
悲观离线锁要求业务事务在操作数据前先拿到锁,从源头上避免冲突,代价是限制并发。选锁类型时有三条路。独占写锁:只在业务事务要编辑数据时才需要获取,忽略对数据的读——两个事务不能同时编辑同一份数据,但读操作完全不受限制;如果对”读到最新数据”没有严格要求,这是首选,通常也是企业系统里并发性最好的选择。独占读锁:业务事务哪怕只是想读到最新数据(不一定要修改)也要先拿锁,会严重限制系统并发度,一般不推荐。读/写锁:把前两者的优点结合起来——读锁和写锁互斥(有人持读锁时不能加写锁,反之亦然),但并发的读锁彼此不冲突(一个读锁只是防止别人写,不妨碍别人也来读),这样既能保证读到的数据不会中途被改,又不会像独占读锁那样把所有读操作都串行化;代价是实现起来更复杂,也给业务建模人员增加了理解负担。选锁类型时要同时兼顾并发度、业务实际需求和实现复杂度这三个维度,而且必须让领域建模人员和系统分析师也理解这套加锁策略——加锁从来不只是技术问题,选错锁类型、锁的范围过大或过小,都会导致要么挡不住真正的冲突、要么把多用户系统活生生拖成单用户体验,而这种错误没法靠更高明的技术实现来挽救,只能从加锁策略本身去修正。
结构图:
flowchart TB
A["悲观离线锁三种类型"]
A --> B["独占写锁<br/>只锁编辑,忽略读<br/>并发性最好,企业系统首选"]
A --> C["独占读锁<br/>读也要锁<br/>并发性最差,一般不推荐"]
A --> D["读/写锁<br/>读写互斥,读读不互斥<br/>兼顾两者,实现更复杂"]
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第16章 离线并发模式"之"16.2.1 运行机制"(源文件:_epub-src/OEBPS/Text/000193.html)
- 结论依据:原文说明"第一个选择是使用独占写锁,只在业务事务获取锁是为了编辑会话数据时才需使用该锁……如果业务事务必须读出最新的数据……应使用独占读锁……这要求业务事务仅仅为了读出数据才获取锁。很显然这样的策略势必严重限制系统的并发性……第三种策略结合了上面两种锁……称为读/写锁……读锁和写锁是互斥的……并发的读锁是允许的",直接支撑本卡结构图。
- 原始内容:对大多数企业系统而言,互斥写锁比互斥读锁能提供更好的并发性。