select的for update
select … for update查询
select查询是不加锁的,select…for update是会加锁的,而且是悲观锁,但是在不同查询条件时候加的锁的类型(行锁,表锁)是不同的。
select * from t_user where id = 1 for update;
在where 后面查询条件是主键索引,唯一索引时候是行锁
查询条件是普通字段时候加的是表锁
校验
**首先:**关闭自动提交,通过set @@autocommit=0; 设置为手动提交。0代表手动提交,1代表自动提交
1.主键id正常
2.主键id异常
3.唯一索引正常
4.唯一索引异常
5.普通索引表锁异常
唯一索引 age = 10 update 10 修改 应该可以
select * from t_user where id = 1 for update;
update t_user set age = 20 where id = 1;
更新失败
update t_user set age = 20 where id = 2;
更新成功
因为id是主键索引,for update 加的是行锁,所以id=1不能被修改,而id=2修改成功。
age 是唯一索引
select * from t_user where age = 10 for update;
查询结果
+++++++++++++++++++
+id ++ age++ code +
+1 ++ 10 ++ 03 +
+++++++++++++++++++
update t_user set age = 20 where id = 1;
更新失败
因为age= 10对应的id是1;
所以该行修改时候就会失败
select * from t_user where code = 01 for update;
update t_user set code = 2 where id = 1;
更新失败
由上次查询结果可知
id=1,和code=01,并不在同一行
但是在修改时候修改 id=1 并不成功,所以加的是表锁
版权声明:本文为m0_53077601原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。