选择查询语句不会被锁定,但选择.for update不仅有查询的功能,还有锁,而且是悲观锁。
那么它是行锁还是表锁取决于是否使用了索引/主键。
如果没有使用索引/主键,则它是表锁,否则它是行锁。
00-1010创建表sql。
//id是主键//name是唯一索引创建表` user` (`id`int (11)不为null auto _ increment,` name`varchar (255)默认为null,` age`int (11)默认为null,` code` varchar (255)默认为null,主键(` id `),key` idx _ age ` (` age `)使用btree)engine=innodb auto _ increment=1570068默认charset=utf8需要关闭自动提交,并设置@@autocommit设置为手动提交。0代表手动提交,1代表自动提交。
00-1010示例1:
使用主键id作为查询条件,然后打开另一个事务来更新数据。更新被阻止和锁定,要查询的id为1的行数据被锁定。
图1显示了第一个事务,该事务尚未提交。图2显示了第二个事务,它更新数据并被阻止。图3显示了第二个事务,它长时间未能获得锁,并报告了一个错误。
例2:
当我们打开一个事务来更新另一个id为2的数据时,
示例3(索引):
Age在表创建开始时创建了一个唯一的索引。
例4:
使用通用字段代码进行操作。
对于另一个事务,我将更新另一个数据。如果更新成功,我将锁定该行,如果失败,我将锁定该表。
00-1010如果查询条件中使用了索引/主键,则选择.for update将锁定行。
如果是普通字段(无索引/主键),则选择.for update将锁定该表。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/48743.html