开始一个新事务会强制当前事务提交吗?

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

2
假设您说您想要两个服务器实例同时工作时,您指的是在同一台服务器上运行的两个独立会话。句子“开始事务会导致任何未决事务被提交”仅涉及同一会话中的任何未决事务。摘自http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

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

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

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)

0

在MySQL中,启动下一个事务会隐式地只在同一会话中提交先前挂起的事务。

例如,在MySQL上有person表格,其中包含如下所示的idname

person表格:

id name
1 John
2 Tom

首先,使用仅一个命令提示符(具有相同会话),按照以下步骤在MySQL上使用默认隔离级别REPEATABLE READ

流程 命令提示符1(CP1) 说明
步骤1 mysql -u root -p CP1登录MySQL。
步骤2 USE test CP1使用test数据库。
步骤3 BEGIN; CP1开始一个事务。
步骤4 SELECT * FROM person;

1 John
2 Tom
CP1读取person表格。
步骤5 UPDATE person set name = "Lisa" where id = 2; CP1将Tom更新为Lisa
步骤6 BEGIN; 现在,CP1开始了下一个事务,因此前一个挂起的事务在同一会话中被隐式提交。
步骤7 ROLLBACK; CP1回滚。
步骤8 ROLLBACK; CP1再次回滚。
步骤9 SELECT * FROM person;

1 John
2 Lisa
CP1读取person表格。

Lisa没有回滚到Tom,因此开始下一个事务会隐式提交同一会话中挂起的前一个事务。

其次,使用两个命令提示符(具有两个不同的会话),您可以按照下面所示的步骤在MySQL上使用默认隔离级别REPEATABLE READ

流程 命令提示符1(CP1) 命令提示符2(CP2) 说明
步骤1 mysql -u root -p CP1登录MySQL。
步骤2 mysql -u root -p CP2登录MySQL。
步骤3 USE test CP1使用test数据库。
步骤4 USE test CP2使用test数据库。
步骤5 BEGIN; CP1开始一个事务。
步骤6 SELECT * FROM person;

1 John
2 Tom
CP1读取person表。
步骤7 UPDATE person set name = "Lisa" where id = 2; CP1将Tom更新为Lisa
步骤8 BEGIN; 现在,CP2开始下一个事务,但是CP1不同会话中的先前挂起的事务没有隐式提交。
步骤7 ROLLBACK; CP1回滚。
步骤8 ROLLBACK; CP2回滚。
步骤9 SELECT * FROM person;

1 John
2 Tom
CP1读取person表。

Lisa被回滚到Tom,因此在不同会话中开始下一个事务不会隐式提交不同会话中的先前挂起的事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接