sql - SELECT FOR UPDATE 锁定查询

标签 sql mysql transactions

我正在使用 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/

相关文章:

mysql - SQL 语法错误 near except

java - 预期 SQL 错误时出现 UnsupportedOperationException

sql - T-SQL 中 ISNULL 和 COALESCE 的区别

sql - 将 smalldatetime 数据类型转换为 varchar 数据类型

mysql - 计数不同的值,其中另一个值的计数 = 1

mysql - mySql传递多个参数时CALL语句语法错误

hibernate - Java Hibernate 回滚内存更改

python - 将插入合并到一个事务中 Python SQLite3

php - 从 MySQL 中的两个连接表中获取多个计数

sql - 如何使用 SQL (BigQuery) 计算 TF/IDF