2013-11-14 88 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)