2011-07-07 53 views
16

我已閱讀this article from dev.mysql在共享模式下選擇鎖定

在頁面

是一個例子,當使用選擇更新和不共享模式使用鎖,並說

這裏,LOCK IN SHARE MODE並不是一個好的 解決方案,因爲如果兩個用戶閱讀同時 計數器,其中至少有一個 在僵局結束時 嘗試更新計數器

但這個頁面的第一行說

SELECT ... LOCK IN SHARE模式: 行讀取的最新的數據,**所以 如果他們屬於另一個交易** 也沒有說但承諾,讀取 塊,直到該交易結束

有悖論嗎?

我的意思是兩個用戶不要在同一時間東陽 讀取計數器,如果他們屬於另一個事務讀 塊,直到交易結束。

回答

18

如果有另一個事務修改了該行,SELECT ... LOCK IN SHARE MODE等待。如果該行未被修改,則不會等待。這導致第一種情況,即2個事務可以選擇...鎖定在共享模式下,但它們都不能更新記錄(死鎖)

+0

所以選擇更新等待,如果bloked行修改或未由user1修改之前提交併鎖定在共享模式等待只有阻止的行由user1修改之前提交? – user677900

+4

區別在於,您可以在共享模式下使用select ... lock在2個事務中選擇一個和相同的記錄,但不能使用select ...進行更新。選擇更新塊另一個選擇更新或在同一記錄上選擇鎖定共享模式。 –

11

試試這個。打開兩個終端PowerShell的Windows中,xterm中,在Linux控制檯,....連接到MySQL:

創建表child_codes(從MySQL documentation拍攝)

mysql> create table child_codes (counter_field integer); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into child_codes set counter_field = 1; 
Query OK, 1 row affected (0.00 sec) 

session 1 (terminal 1):    session 2 (terminal 2):                   

              mysql> start transaction; 
              Query OK, 0 rows affected (0.00 sec) 

              mysql> select counter_field from child_codes 
                 lock in share mode; 
              +---------------+ 
              | counter_field | 
              +---------------+ 
              |    1 | 
              +---------------+ 
              1 row in set (0.00 sec) 

mysql> start transaction; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select counter_field from 
      child_codes lock in share mode; 
+---------------+ 
| counter_field | 
+---------------+ 
|    1 | 
+---------------+ 

              mysql> update child_codes set counter_field = 2; 
              ERROR 1205 (HY000): Lock wait timeout exceeded; 
              try restarting transaction 

我也認爲,如果其它事務執行查詢共享鎖選擇模式下查詢被阻塞(等待其他事務提交或回滾)。但是像達哈澤提到的如果該行沒有被修改,它不會等待。我相信這個行爲必須在MySQL文檔中提及。

+0

這個例子似乎是不切實際的,與「*其他會話可以讀取行,但在你的事務提交之前不能修改它們,如果這些行中的任何一行被另一個尚未提交的事務改變了,你的查詢就會等待事務結束,然後使用最新值。*「如果另一個事務釋放了鎖,則不應檢測到阻塞或死鎖。 http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html – Tiny

相關問題