MySQL 的共享鎖和排它鎖以及自動提交

木大大發表於2021-04-30

分兩種鎖
共享鎖: 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 操作,資料表中的資料未有變化

MySQL 的共享鎖和排它鎖以及自動提交

執行 commit 之後

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

MySQL 的共享鎖和排它鎖以及自動提交

測試完成,開啟自動提交

Set autocommit = 1;

總結

在未關閉自動提交前提下(即自動提交已開啟情況下),且不是在事務中,那麼以下SQL語句的鎖功能並不能生效。

共享鎖: SELECT … LOCK IN SHARE MODE
排它鎖: SELECT … FOR UPDATE

若是,關閉了自動提交,之後的更新操作都需要 進行 commit 提交。不然資料不會被修改。

若是,關閉了自動提交,之前加鎖的資料都需要 進行 commit 提交進行解鎖。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章