2010-11-23 142 views
0

我一直在閱讀有關MySQL的交易,但我無法理解一個問題。 事務是一種確保在一個語句塊中執行全部或全部執行的方法。但是,事務是否確保對其中一部分行進行「鎖定」?也就是說,說我有下面的語句(僞):MySQL交易問題

1) START TRANSACTION 
2) SELECT row1 FROM table 
3) UPDATE table SET row1='new value' 
4) COMMIT 

現在,假設一個用戶試圖在其中系統是在上述第3行的時間訪問ROW1 ..請問該用戶有權訪問的行(然後他可以看到row1的舊值),還是必須等到事務處理完成,然後才能使用新值讀取該行。

謝謝! Joel

回答

2

不,事務和隔離是兩個單獨的概念。

五隔離級別:

  1. 讀取已提交意味着禁止髒讀;不可重複讀取和幻像讀取可能發生。
  2. 讀取未提交表示可能發生髒讀,不可重複讀取和幻讀。
  3. 可重複讀取意味着防止髒讀和不可重複讀取;幻像讀取可能會發生。
  4. 可串行化意味着可以防止髒讀,不可重複讀取和幻像讀取。
0

當您啓動一個事務時,只有在提交事務後,您所做的更改才變爲可見。它更像是一個孤立的而不是鎖。

HTH

2

這取決於。請參閱MySQL SELECT statement syntax,特別是FOR UPDATELOCK IN SHARE MODE

「如果對使用頁鎖或行鎖的存儲引擎使用FOR UPDATE,查詢檢查的行將被寫鎖定,直到當前事務結束。使用LOCK IN SHARE MODE設置共享鎖,允許其他事務讀取被檢查的行但不更新或刪除它們。「