MySQL数据库用 FOR UPDATE 锁定表行
FOR UPDATE 仅适用于 InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
使用及验证步骤:
1. 使用begin开始一个事务。
2. 利用 select * for update 锁定行。
3. 在新窗口中验证非选中行是否被锁定----未被锁定。
4. 在新窗口中验证选中行是否被锁定-----锁定,update语句在等待了一段时间后失败。
举例:
mysql> begin work;
Query OK, 0 rows affected (0.00 sec)
mysql> select STATE from USER where USERID=303 for update;
+-------+
| STATE |
+-------+
| 92 |
+-------+
1 row in set (0.00 sec)
mysql> commit work;
Query OK, 0 rows affected (0.02 sec)
对 FOR UPDATE 进一步 说明:
假设有个表PRODUCTS,里面有ID跟NAME两个字段,ID是主键。
1. 明确指定主键并且有此数据,是 row lock(行锁)。
代码如下:
SELECT * FROM PRODUCTS WHERE ID='3' FO
FOR UPDATE 仅适用于 InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
使用及验证步骤:
1. 使用begin开始一个事务。
2. 利用 select * for update 锁定行。
3. 在新窗口中验证非选中行是否被锁定----未被锁定。
4. 在新窗口中验证选中行是否被锁定-----锁定,update语句在等待了一段时间后失败。
举例:
mysql> begin work;
Query OK, 0 rows affected (0.00 sec)
mysql> select STATE from USER where USERID=303 for update;
+-------+
| STATE |
+-------+
| 92 |
+-------+
1 row in set (0.00 sec)
mysql> commit work;
Query OK, 0 rows affected (0.02 sec)
对 FOR UPDATE 进一步 说明:
假设有个表PRODUCTS,里面有ID跟NAME两个字段,ID是主键。
1. 明确指定主键并且有此数据,是 row lock(行锁)。
代码如下:
SELECT * FROM PRODUCTS WHERE ID='3' FO