知识卡片

离线并发问题的处理原则:能不自己处理就不自己处理

普通读书笔记卡

内容

应当尽可能让事务系统自己处理并发问题——一旦要跨系统事务自己处理并发控制,就等于跳进了一片复杂又危险的水域。只有当业务事务和系统事务的边界确实错位、绕不开时,才应该考虑离线并发控制的专门模式;换句话说,如果能把整个业务事务塞进单个系统事务、或者能承受长事务带来的可伸缩性损失,就应该直接这样做,把并发控制的麻烦丢给成熟的事务处理软件,这些专门的离线并发模式只是在前两条路都走不通时的退路,而且远不能覆盖所有并发问题,只是一个开端。在不得不自己处理的前提下,首选是乐观离线锁——它在业务事务之间使用乐观并发机制,编程实现容易、并发灵活性也最好;局限在于只有到提交数据那一刻才能发现业务事务将要失败,如果用户已经花了一小时填一份详细租约、这时才告知失败,代价会很大、也会打击用户对系统的信心。备选是悲观离线锁——能更早发现冲突,但编程实现更难、也会拉低系统灵活性。此外还可以用粗粒度锁把一组对象当作一个整体来管理并发,减少逐个对象加锁的麻烦;或用隐含锁让开发者完全不用直接操心锁的管理,进一步减少工作量和因疏忽产生、难以察觉的错误。特别值得强调的是:并发从来不是纯技术问题、不能等需求分析做完再补——选乐观还是悲观会直接影响用户对整个系统的观感,一个明智的悲观离线锁设计和一个好的粗粒度锁划分,都离不开对具体业务领域的深入理解。

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第5章 并发"之"5.6 离线并发控制的模式"(源文件:_epub-src/OEBPS/Text/000039.html) - 结论依据:原文说明"处理离线并发问题的首选是使用乐观离线锁……将它作为首选是因为它易于编程实现,还能提供最好的灵活性……另一个方法是使用悲观离线锁,它可以尽早地发现错误,但更难以编程实现……对于并发的一个常见看法是,认为它是一个纯粹的技术问题,可以在需求分析完成后再考虑。我们不同意这个观点",直接支撑本卡结论。 - 原始内容:请记住,只在不得已的时候才使用这些方法。如果可以把所有的业务事务都放在单个系统事务中完成,那么就这样做。如果可以忍受长事务带来的可伸缩性损失,那就这样做。