正如标题所说,MySQL中的存储过程是原子的吗?也就是说像这样的东西
for (..)
<check_if_row_has_flag>
for (..)
<update_row>
以原子方式工作?
有趣的是,除了2009年的一个论坛帖子外,我在谷歌上找不到太多关于这方面的信息。
发布于 2018-06-29 07:50:24
不,存储过程不是原子的。
上面显示的伪代码有一个竞争条件。第一个循环检查行是否有标志,它将返回一个答案,但是除非执行locking read,否则在过程读取行之后,另一个并发会话可能会立即更改标志。
这就是乐观锁定的效果。直到您发出一条语句来锁定行,行才会被锁定。因此,即使在事务中,也没有原子锁定。
MySQL支持的原子性是用于事务提交。事务是原子的,因为在事务期间所做的所有更改都会成功,否则所有更改都会回滚。其他会话无法看到处于部分完成状态的事务。
请回复下面的评论:
您可以在应用程序中调用事务内的过程:
START TRANSACTION;
CALL MyProcedure();
COMMIT;
您甚至可以在过程主体中显式地启动和提交一个事务(或多个事务):
CREATE PROCEDURE MyProcedure()
BEGIN
START TRANSACTION;
...UPDATE, INSERT, DELETE, blah blah...
COMMIT;
END
但是该过程本身并不隐式地启动或提交事务。
https://stackoverflow.com/questions/51092508
复制相似问题