select的for update

select的for update

  • 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 并不成功,所以加的是表锁

你可能感兴趣的:(java汇总,java常用小功能,数据库-mysql,r语言,java,开发语言)