在事务中自增并返回一个字段的MySql InnoDB操作

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”语句。我的做法正确吗?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接