2014-01-31 102 views
3

使用InnoDB,當調用BEGIN時,MySQL事務鎖定新創建的行,然後在調用commit時解鎖它們? 例如:MySQL正在更新和/或選擇InnoDB中的行鎖定行

$query = "INSERT INTO employee (ssn,name,phone) 
values ('123-45-6789','Matt','1-800-555-1212')"; 
mysql_query("BEGIN"); 
$result = mysql_query($query); 
mysql_query("COMMIT); 

是否INSERT聲明鎖定該行直至COMMIT被調用,或者是回滾,以防止對其進行修改其他併發連接? 如果沒有,您是否只能通過調用select FOR UPDATE鎖定某個事務中的某個塊的讀取和任何修改?

回答

3

在提交事務之前,新創建的記錄對其他連接是不可見的。其他連接無法修改,因此無需鎖定。

+0

因此,無論是插入,更新還是選擇語句,並且在事務中調用,它都遵守酸序列化,因此被鎖定(不能被其他事務讀取或寫入?) – tommo

+0

默認情況下是。除了將--transaction-isolation選項配置爲其他內容。欲瞭解更多信息,請閱讀http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html – vidaica

+0

當你說「新創建的記錄被創建時,它對其他連接是不可見的,所以有不需要鎖定它「如果記錄不是新的,而不是插入,'update'被稱爲?要更新的表需要被事務中的FOR UPDATE鎖定爲true?請參閱:http://www.databasejournal.com/features/mysql/article.php/10897_3382171_2/Transactions-in-MySQL.htm – tommo