知识卡片

并发冲突判断本质是领域问题,而非纯技术判断

普通读书笔记卡

内容

任何锁模式(乐观离线锁也不例外)本身都不能替企业应用彻底解决并发和时序问题,因为”这算不算冲突”这件事经常不是技术能回答的问题,而是业务问题。还是那个顾客地址的例子:生成账单时用了顾客的旧地址算税率,这真的构成一个必须阻止的冲突吗?也许业务上完全可以接受用旧地址计算——但如果可以接受,那”该用哪个版本的地址”本身就是一个需要业务规则来裁决的问题,不是靠版本号检查能回答的。另一个典型场景是集合:如果两个会话同时往同一个集合里添加不同的元素,标准的乐观离线锁模式检测不到任何冲突(因为两边都只是各自”新增”,没有互相覆盖),但这明显可能违反某条业务规则(比如集合的容量上限,或者两个元素之间存在互斥关系)——这种冲突同样落在技术锁机制的视野之外。可迁移启发:设计并发控制方案时,不能止步于”技术上该用乐观锁还是悲观锁、版本号该覆盖哪些字段”这类实现层面的问题,还必须回过头去追问一个更根本的业务问题——”两个并发操作在什么条件下才真正构成需要阻止的冲突”,这个判断标准来自业务规则本身,而不是数据库锁机制能替你决定的;技术锁只能保证”检测到的冲突”被正确处理,但保证不了”该被检测为冲突的场景”都被覆盖到。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第16章 离线并发模式"之"16.1 乐观离线锁"(源文件:_epub-src/OEBPS/Text/000190.html) - 结论依据:原文说明"必须再次强调,在企业应用中的并发管理问题更是一个领域问题,而不只是技术问题。上面所说的顾客地址问题真的是一个冲突吗?使用旧的顾客信息计算税率也可能是允许的,但究竟应该使用哪个版本呢?这就是一个业务问题。或者考虑一个集合。当两个会话同时向集合中加入元素时会发生什么呢?典型的乐观离线锁模式无法防止这种情况发生,尽管非常明显这违反了业务规则",直接支撑本卡结论。 - 原始内容:这就是一个业务问题……典型的乐观离线锁模式无法防止这种情况发生,尽管非常明显这违反了业务规则。