3

在我的应用程序中,我想从 InnoDB 表中获取一个值,然后在单个事务中递增并返回它。我还想锁定我要更新的行,以防止另一个会话在事务期间更改值。我写了这个查询;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT @no:=`value` FROM `counter` where name='booking' FOR UPDATE;
UPDATE `counter` SET `value` = `value` + 1 where `name`='booking';
SELECT @no;
COMMIT;

我想知道隔离级别是否正确以及是否需要“FOR UPDATE”语句。我做对了吗?

4

1 回答 1

4

是的,无论你做什么都很好。

下面几行我直接引用 MySQL 文档。

“如果您查询数据,然后在同一事务中插入或更新相关数据,则常规 SELECT 语句无法提供足够的保护。.. 要实现计数器的读取和递增,首先使用 FOR UPDATE 执行计数器的锁定读取,然后然后递增计数器。例如:

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置了与搜索的 SQL UPDATE 将在行上设置的锁相同的锁。

参考:

https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html

于 2015-04-24T13:44:42.373 回答