【问题标题】:does starting a new transaction forces the current transaction to commit?开始一个新事务会强制当前事务提交吗?
【发布时间】:2013-11-14 17:55:09
【问题描述】:

我的服务器使用事务将数据写入数据库,如果所有查询都成功,它将提交,否则将回滚。现在我想让服务器的两个实例同时在同一个数据库和表上工作。 当我阅读 mysql 的事务文档时,我注意到这句话:“开始一个事务会导致提交任何待处理的事务”。这是否意味着如果服务器 A 启动事务 A,而事务 A 尚未完成,服务器 B 启动事务 B,则事务 A 被强制提交?这对我来说没有意义。如果是这种情况,我如何确保在事务 A 正常完成之前不执行事务 B? SET autocommit = 0 可以替代这个问题吗?

【问题讨论】:

    标签: mysql transactions autocommit


    【解决方案1】:

    假设当您说希望服务器的两个实例同时工作时,您的意思是在同一台服务器上运行两个单独的会话。

    “开始一个事务会导致提交任何待处理的事务”这句话仅指同一会话中的任何待处理事务。来自http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

    本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像您在执行语句之前执行了 COMMIT 一样。

    因此,如果 Session B 在 Session A 提交之前启动事务,它不会强制 Session A 提交。

    【讨论】:

      【解决方案2】:
      mysql> CREATE TEMPORARY TABLE super(id int);
      Query OK, 0 rows affected (0.04 sec)
      
      mysql> START TRANSACTION;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> INSERT INTO super VALUE(1);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> START TRANSACTION;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT * FROM super;
      +------+
      | id   |
      +------+
      |    1 |
      +------+
      1 row in set (0.00 sec)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多