【问题标题】:Are MySql stored procedures atomic?MySql 存储过程是原子的吗?
【发布时间】:2018-12-08 02:29:59
【问题描述】:

正如标题所说,MySQL 中的存储过程是原子的吗?即会像

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

以原子方式工作?

有趣的是,除了 2009 年的一个论坛帖子之外,我在 Google 上找不到太多关于此的内容。

【问题讨论】:

  • 除非你使用事务 - 否。
  • @PM77-1,即使你使用交易,没有。
  • 如果“atomic”表示“all or none”,那么事务将起作用。

标签: mysql atomic


【解决方案1】:

不,存储过程不是原子的。

您在上面显示的伪代码具有竞争条件。第一个循环检查一行是否有标志,将返回答案,但除非您执行locking read,否则另一个并发会话可能会在您的过程读取该行后立即更改标志。

这是乐观锁定的效果。在您发出语句锁定行之前,行不会被锁定。因此,即使在事务中,您也没有原子锁定。

MySQL 支持的原子性是用于事务提交。事务是原子的,因为在事务期间所做的所有更改都会成功,否则所有更改都会回滚。其他会话无法看到您处于部分完成状态的交易。


下面是cmets:

您可以从您的应用程序中调用事务中的过程:

START TRANSACTION;
CALL MyProcedure();
COMMIT;

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

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

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

【讨论】:

  • 所以我说存储过程甚至不能保证事务提交级别的原子性是对的吗?
  • 不,这是不对的。如果您启动一个事务并运行您的过程,则该过程中所做的更改是该事务的一部分,然后您可以提交所有这些更改将自动提交。
  • 但是存储过程本身并不能保证正确吗?
  • 正确。存储过程可以在调用应用程序的控制下在事务范围内运行。但它们不会隐式启动和提交事务。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2021-01-29
相关资源
最近更新 更多