来源:blog.csdn.net/qq_42956376/article/details/109544539select查询语句不会加锁,但是select.......forupdate不仅有查询的功能,还会加锁,它是一个悲观锁。所以加行锁还是加表锁取决于是否使用索引/主键。如果不使用索引/主键,就是表锁,否则就是行锁。验证:创建表sql//id作为主键//name作为唯一索引CREATETABLE`user`(`id`INT(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(255)DEFAULTNULL,`age`INT(11)DEFAULTNULL,`code`VARCHAR(255)DEFAULTNULL,PRIMARYKEY(`id`),KEY`idx_age`(`age`)USINGBTREE)ENGINE=INNODBAUTO_INCREMENT=1570068DEFAULTCHARSET=utf8需要关闭自动提交,通过设置@@autocommit=0;设置为手动提交。0表示手动提交,1表示自动提交。结合例子验证例1:以主键id为条件查询,再开启另一个事务更新数据,更新被阻塞,锁定,锁定要查询的id为1的行数据.图1是第一个事务,事务没有提交图2是第二个事务,要更新数据,阻塞了图3是第二个事务,长时间得不到锁,报错。例2:我们正在启动一个事务来更新另一条id为2的数据。例3(索引):在建表之初在age上创建一个唯一索引。示例四:使用普通字段代码操作另一笔交易,我更新了另一笔数据。如果更新成功,则行被锁定,如果失败,则表被锁定。结果:如果查询条件使用了索引/主键,那么select.....forupdate会锁住行。如果是普通字段(无索引/主键),那么select.....forupdate会锁表。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
