MySQL 中的行鎖是一種用于保護數據的機制。它可以鎖定表中的某一行,以防止其他會話在該行上執行修改操作。但是,在某些情況下,MySQL 會將行鎖設置為“不允許讀”,即使您想讀取該行的數據,也無法得到它。
mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Users WHERE id=1 FOR UPDATE;
+----+------+---------+---------------------+
| id | name | email | last_login |
+----+------+---------+---------------------+
| 1 | Tom | tom@xxx | 2022-04-09 10:42:08 |
+----+------+---------+---------------------+
1 row in set (0.00 sec)
如上例所示,我們已經在事務中鎖定了 id 為 1 的用戶行。此時,任何其他的會話都無法對這個用戶進行修改。但是你可能會想,我可以讀取這個用戶的信息,對吧?
mysql> SELECT * FROM Users WHERE id=1;
(empty set)
然而這是不行的,因為該行已經被鎖定并不允許讀取。此時如果你嘗試讀取某一行的數據,MySQL 將會等待行鎖被釋放。
總之,在使用 MySQL 行鎖的過程中,請注意行鎖的方向和持有時間,務必避免出現“不允許讀”的情況。
上一篇不讓獲取焦點的css屬性
下一篇mysql 行鎖 查詢