我正在使用 MySql 5.x,在我的环境中,我有一个名为 CALLS 的表。
表 CALLS 有一个列状态,它采用枚举 {inprogress, completed}。
我希望表的读取/更新是行锁定的,所以:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET AUTOCOMMIT = 0;
SELECT amount from CALLS where callId=1213 FOR UPDATE;
COMMIT
基本上,即使在我只需要读取金额并返回的情况下,我也会执行 FOR UPDATE。我发现这使我能够确保防止读取/更新相互干扰。然而,有人告诉我这会降低应用程序的并发性。
有没有办法在不产生锁定开销的情况下实现相同的事务一致性?谢谢。
最佳答案
免责声明:MySQL 通常充满惊喜,因此以下内容可能不真实。
你在做什么对我来说没有任何意义:你在 SELECT 之后提交,这应该会打破锁。所以在我看来,您的代码实际上不应该产生任何重大开销;但它也不会给您带来任何一致性改进。
一般来说,SELECT FOR UPDATE 可以是一种非常可靠且合理的方式来确保一致性,而不会占用比实际需要更多的锁。但当然,它应该只在需要时使用。也许您应该有不同的代码路径:一个(使用 FOR UPDATE)在后续更改操作中使用检索到的值时使用。另一个(不使用 FOR UPDATE)在不必保护值免受更改时使用。
关于sql - SELECT FOR UPDATE 锁定查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/392609/