mysql for update使用

相關連接:

mysql lock in share mode使用

 

 

for update 既可以鎖表又可以鎖行,具體怎麼做的.直接從網上拿來一個版本:

利用select * for update 可以鎖表/鎖行。自然鎖表的壓力遠大於鎖行。所以我們採用鎖行。什麼時候鎖表呢?

假設有個表單products ,裏面有id跟name二個欄位,id是主鍵。
例1: (明確指定主鍵,並且有此筆資料,row lock)
SELECT * FROM wallet WHERE id=’3′ FOR UPDATE;
例2: (明確指定主鍵,若查無此筆資料,無lock)
SELECT * FROM wallet WHERE id=’-1′ FOR UPDATE;
例2: (無主鍵,table lock)
SELECT * FROM wallet WHERE name=’Mouse’ FOR UPDATE;
例3: (主鍵不明確,table lock)
SELECT * FROM wallet WHERE id<>’3′ FOR UPDATE;
例4: (主鍵不明確,table lock)
SELECT * FROM wallet WHERE id LIKE ‘3’ FOR UPDATE;

 

 

但是使用for update的時候需要注意以下幾點:

一.for update開啓的並非完全是排他鎖X.如果有其他事務開啓着共享鎖S,那麼for update根本不會阻塞.如下

#--------------------------事務1----------------------------

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

mysql> select name from user where id =2;
+------+
| name |
+------+
| 22   |
+------+
1 row in set (0.00 sec)


#------------------------事務2----------------------
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select pl from user where id =2 for update;
+------+
| pl   |
+------+
|  143 |
+------+
1 row in set (0.00 sec)





二.但是如果其他事務開啓的是排他鎖X.那麼for update開啓的也是排他鎖X,可以看到下面的代碼裏,for update被阻塞了,直到排他鎖X提交釋放.

------------------------------
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set pl =123 where id =2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

------------------------------

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

mysql> select pl from user where id =2 for update;

三.同樣的,如果for update 未提交,那麼其他排它鎖X也是不能進來的.

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

mysql> select pl from user where id =2 for update;
+------+
| pl   |
+------+
|  123 |
+------+
1 row in set (10.70 sec)


-----------------這個很明顯阻塞超時了-----------------------


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

mysql> update user set pl =123 where id =2;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

四.還有個問題,在第二種情況,如果for update 不在事務中,仍然生效.這個要注意.會比較坑.爲了好管理,請全部在事務中.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章