分兩種鎖
共享鎖: SELECT … LOCK IN SHARE MODE
排它鎖: SELECT … FOR UPDATE
1.手動提交 排它鎖
關閉 MySQL 自動提交Set autocommit = 0;
視窗1執行命令
mysql> select * from stu where id=1 for update;
+----+------+-----+---------+
| id | name | num | version |
+----+------+-----+---------+
| 1 | 張三 | 86 | 0 |
+----+------+-----+---------+
1 row in set (0.04 sec)
視窗2執行命令,因為視窗1未執行 commit 操作,以至於視窗2阻塞無法讀取
mysql> select * from stu where id =1 for update;
1205 - Lock wait timeout exceeded; try restarting transaction
視窗2執行select語句中不帶 for update,那麼則不影響。
mysql> select * from stu where id =1 ;
+----+------+-----+---------+
| id | name | num | version |
+----+------+-----+---------+
| 1 | 張三 | 86 | 0 |
+----+------+-----+---------+
1 row in set (0.05 sec)
測試完成 開啟自動提交
Set autocommit = 1;
2.手動提交 資料更新操作
關閉自動提交
Set autocommit = 0;
進行資料更新
mysql> update stu set name=111 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
此時,還未進行 commit 操作,資料表中的資料未有變化
執行 commit 之後
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
測試完成,開啟自動提交
Set autocommit = 1;
總結
在未關閉自動提交前提下(即自動提交已開啟情況下),且不是在事務中,那麼以下SQL語句的鎖功能並不能生效。
共享鎖: SELECT … LOCK IN SHARE MODE
排它鎖: SELECT … FOR UPDATE
若是,關閉了自動提交,之後的更新操作都需要 進行 commit 提交。不然資料不會被修改。
若是,關閉了自動提交,之前加鎖的資料都需要 進行 commit 提交進行解鎖。
本作品採用《CC 協議》,轉載必須註明作者和本文連結