【发布时间】:2012-06-29 04:43:35
【问题描述】:
我需要用原则锁定整个表(不是单行),如果可能的话,我想在没有本地查询的情况下这样做。
pessimistic locking 的文档仅描述了如何通过这些方法锁定特定实体:
- EntityManager#find
- EntityManager#lock
- 查询#setLockMode
我有一个事务需要插入一行,其值取决于表中其余行的值,因此我需要防止两个事务同时在该表上执行。
我正在使用显式事务划分,它应该可以很好地与锁定配合使用(根据上面的文档)。
注意:在这种情况下,乐观锁定不够好,我无法重试事务。此外,查询不应该很慢,因此性能不是问题。
编辑:我举个例子。想象一下,您想手动构建一个 auto_increment,并且您必须从表中选择 max() 以获取上一个结果才能插入下一个结果。您必须确保没有两个事务尝试插入相同的值,以防它们同时选择 max()。
当 auto_increment 不好时,我正在寻找此问题的通用解决方案,例如使用字符串、多列、散列或您必须对前一个行集进行的任何计算。
锁定是一种可靠的解决方案,与乐观锁定不同,您不必重试错误。
那么,有没有什么方法可以在学说中使用表锁定?
【问题讨论】:
-
Imo,更好的选择是打开一个事务,通过选择查询从您需要的表中获取数据,然后进行更新。
-
问题是如果第二个事务在第一个提交之前出现,那么第二个事务将插入一个无效值。第二个事务的结果也应该取决于第一个事务插入的行。这就是我需要锁定的原因,该表的事务不应重叠。
标签: mysql symfony locking doctrine-orm