正如标题所说,mysql中的存储过程是原子的吗?i、 你想要点什么吗
for (..) <check_if_row_has_flag> for (..) <update_row>
原子工作?有趣的是,除了2009年的一个论坛帖子,我在google上找不到太多关于这个的信息。
6ojccjat1#
不,存储过程不是原子的。上面显示的伪代码具有竞争条件。第一个循环检查一行是否有标志,将返回一个答案,但除非执行锁定读取,否则另一个并发会话可能会在过程读取该行后立即更改标志。这就是乐观锁定的效果。在发出语句锁定行之前,不会锁定行。因此,即使在事务中,也没有原子锁定。mysql支持的原子性是事务提交。事务是原子的,因为在事务期间所做的所有更改都会成功,否则所有更改都会回滚。其他会话无法看到处于部分完成状态的事务。请回复以下评论:您可以从应用程序调用事务中的过程:
START TRANSACTION; CALL MyProcedure(); COMMIT;
您甚至可以在过程体中显式地启动和提交一个事务(或连续提交多个事务):
CREATE PROCEDURE MyProcedure() BEGIN START TRANSACTION; ...UPDATE, INSERT, DELETE, blah blah... COMMIT; END
但是过程本身并不隐式地启动或提交事务。
1条答案
按热度按时间6ojccjat1#
不,存储过程不是原子的。
上面显示的伪代码具有竞争条件。第一个循环检查一行是否有标志,将返回一个答案,但除非执行锁定读取,否则另一个并发会话可能会在过程读取该行后立即更改标志。
这就是乐观锁定的效果。在发出语句锁定行之前,不会锁定行。因此,即使在事务中,也没有原子锁定。
mysql支持的原子性是事务提交。事务是原子的,因为在事务期间所做的所有更改都会成功,否则所有更改都会回滚。其他会话无法看到处于部分完成状态的事务。
请回复以下评论:
您可以从应用程序调用事务中的过程:
您甚至可以在过程体中显式地启动和提交一个事务(或连续提交多个事务):
但是过程本身并不隐式地启动或提交事务。