1

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

4

2 回答 2

2

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

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

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

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

于 2013-11-14T20:04:38.253 回答
0
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)
于 2014-11-18T15:04:27.013 回答