• select……for update会锁表还是锁行? 没用索引/主键的话就是表锁,否则就是是行锁。


    select……for update会锁表还是锁行?

    select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁。
    那么它加的是行锁还是表锁,这就要看是不是用了索引/主键。
    没用索引/主键的话就是表锁,否则就是是行锁。
    验证:
    建表sql
    //id为主键
    //name 为唯一索引
    CREATE TABLE user (
    id INT (11 )NOT NULL AUTO_INCREMENT,
    name VARCHAR (255 )DEFAULT NULL,
    ageINT (11 )DEFAULT NULL,
    codeVARCHAR (255 )DEFAULT NULL,
    PRIMARYKEY (id ),
    KEY idx_age ( age )USING BTREE
    )ENGINE =INNODB AUTO_INCREMENT =1570068 DEFAULT CHARSET = utf8
    需要关闭自动提交,通过set @@autocommit=0; 设置为手动提交。0代表手动提交,1代表自动提交。
    图片
    结合一下实例验证
    实例1:
    使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。
    图一为第一个事务,并且没有提交事务
    图二为第二个事务,去更新数据,被阻塞了
    图三为第二个事务,长时间拿不到锁报错。
    图片
    实例2:
    我们在开启一个事务对另一条id为2的数据进行更新,
    实例3(索引):
    一开始的创建表就age创建了唯一索引。
    图片
    实例4:
    使用普通的字段code去操作
    另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。
    结果:
    如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。
    如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。
    文章有帮助的话,点赞,在看,转发吧。
    谢谢支持哟 (*^__^*)
    https://view.inews.qq.com/a/20220909A013WZ00
  • 相关阅读:
    天眼查接口的调用
    EditPlus5.0注册码
    图片转化成base64字符串
    java根据图片的url地址下载图片到本地
    将字符串中的数字转化为文字
    String类型转json 转JSONObject 转 JSONArray 以及 遍历
    三个日期类型比较大小 20181123
    字符与字节的区别
    面向对象五大原则
    Struts/Servlet,action转到jsp后,CSS失效,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)
  • 原文地址:https://www.cnblogs.com/sunny3158/p/16735609.html
Copyright © 2020-2023  润新知