通过这个问题,由于交易中止,在解决过程中提到乐观并发的成本更高:
Optimistic vs. Pessimistic locking
如果您正在执行单个更新语句,通常会创建where子句以确保在发生冲突时不进行更新。即您将在where子句中包含原始行状态。如果其他人编辑了该行并且存在冲突,则由于where子句,update语句将简单地更新零记录。 您不需要中止任何交易,因为您的更新未进行任何更改。您只需检查查询修改的行数(通常为1或0),如果修改为0,则向用户显示解决方案。
除非你有多个操作 ,这些操作必须与更新一起是原子的,否则我不认为你需要一个事务来进行单一更新支持乐观并发的子句。但也许我缺少一个细微差别。
对于单个更新语句,是否需要基于原始行状态(对于乐观并发)选择格式良好的where子句?
答案 0 :(得分:1)
通常,您永远不需要任何单个DML语句(插入,更新,删除)的事务。每个单独的DML语句都是原子的。也就是说,它作为一个整体成功或失败。事务允许您将多个DML查询分组到单个原子工作单元中(以便它们作为一个组成功或失败)。
话虽如此,我通常会使用事务更新。这样,更新模式在所有更新/保存中都很常见,我不必担心我正在做多少更新(或者记得添加一个事务,因为我添加了第二个更新语句)。
说完所有这些之后,我认为这不是你问题的答案。
大多数现代Web应用程序的流程类似于:
第2步将比其他两个步骤花费更长的时间。并发模型对此流程没有帮助,因为您无法在步骤1中打开事务并在步骤3中关闭它。因此,如何确保更新的数据与显示的数据相同。虽然格式良好的更新可能会阻止更新发生,但这只是问题的一部分,因为您还必须让用户知道他们的更新失败。
并发选项仅对步骤3中的处理有帮助。如果该过程如下:
悲观并发保证数据在步骤1和步骤4之间不会发生变化;乐观并发不保证任何东西。
我想我是说你是否有一个围绕单个更新语句的事务不会影响乐观并发或悲观并发。应该使用挑选的模型,但两种并发模型都需要处理数据更改。