2013-11-14 54 views
0

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

回答

1

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

句子“开始事务会导致任何挂起的事务被提交”指的是在同一个会话中的任何挂起的事务。从http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

在本节(以及他们的任何同义词)中列出的语句隐含结束当前在当前会话中的任何交易,因为如果你做了执行该语句之前提交。

因此,如果会话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)