2014-07-11 158 views
0

我需要一些關於交易和鎖定的清晰度mysql交易和鎖定MySQL

首先。需要在不同的表中進行兩次或三次插入,但如果其中任何一次插入失敗,則會取消整個操作。所以來了。

START TRANSACTION 

但在所有事情都需要線程成爲唯一的訪問這些表之前。它來了

LOCK TABLES tab1 WRITE, tab2 WRITE 

我應該先做什麼? 按照這個順序做是正確的嗎?

START TRANSACTION; 
LOCK TABLE....; 

INSERT INTO ...; 
if (something wrong) 
{ 
    ROLLBACK; 
    UNLOCK TABLES; 
    return; 
} 

INSERT INTO ...; 
if (something wrong) 
{ 
    ROLLBACK; 
    UNLOCK TABLES; 
    return; 
} 

COMMIT; 
UNLOCK TABLES; 

這篇文章有一些僞JAVA 非常感謝。

+1

你究竟想要做什麼?在大多數情況下,您不必鎖定表格。 InnoDB支持行級鎖定。 –

+0

在考慮插入新數據之前,請檢查tab1中的用戶名是否未使用,並且電子郵件是否在tab2中未使用。由於新用戶註冊並不常見,我認爲我可以承擔獨家訪問。 – mdev

回答

1

使用事務時,表鎖定由數據庫引擎自動處理。使用顯式鎖定語句甚至可能不利於transactional code

13.3.5.1表鎖定和交易互動

  • LOCK TABLES和UNLOCK TABLES與使用交易的互動如下:

  • 鎖定表是不是交易安全的並試圖鎖定表之前暗中提交任何活動的事務。

  • UNLOCK TABLES隱式提交任何活動事務,但前提是鎖定表已用於獲取表鎖。 [...]

雖然在腳本中僞代碼,你只任何其他命令之前使用LOCK TABLE

從程序邏輯的角度來看,webapp的其他功能可能會觸發相同表上的更新?如果您只想防止在交易過程中發生外部更新,則適當transaction isolation(即不是READ UNCOMMITED)應防止任何副作用蔓延。