mysql存储过程是原子的吗?

rqmkfv5c  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(653)

正如标题所说,mysql中的存储过程是原子的吗?i、 你想要点什么吗

for (..)
  <check_if_row_has_flag>
for (..)
  <update_row>

原子工作?
有趣的是,除了2009年的一个论坛帖子,我在google上找不到太多关于这个的信息。

6ojccjat

6ojccjat1#

不,存储过程不是原子的。
上面显示的伪代码具有竞争条件。第一个循环检查一行是否有标志,将返回一个答案,但除非执行锁定读取,否则另一个并发会话可能会在过程读取该行后立即更改标志。
这就是乐观锁定的效果。在发出语句锁定行之前,不会锁定行。因此,即使在事务中,也没有原子锁定。
mysql支持的原子性是事务提交。事务是原子的,因为在事务期间所做的所有更改都会成功,否则所有更改都会回滚。其他会话无法看到处于部分完成状态的事务。
请回复以下评论:
您可以从应用程序调用事务中的过程:

START TRANSACTION;
CALL MyProcedure();
COMMIT;

您甚至可以在过程体中显式地启动和提交一个事务(或连续提交多个事务):

CREATE PROCEDURE MyProcedure()
BEGIN
    START TRANSACTION;
    ...UPDATE, INSERT, DELETE, blah blah...
    COMMIT;
END

但是过程本身并不隐式地启动或提交事务。

相关问题