MySql哪些情况会导致行锁升级为表锁

发布时间 2023-09-19 11:33:01作者: 李若盛开

1、对应的存储引擎没有行级锁(例如:MyIASM)

2、类型转换

检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划,可以清楚地看到了这一点。(数据库类型为varchar时 查询用 数字类型时用不了索引 。但数据库类型为int、datetime时 查询类型为字符串,也可以走索引)

3、即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,也会自动升级为表锁

4、当执行 DDL (使用ALTER TABLE、TRUNCATE TABLE等)语句去修改表结构时,会使用表级锁。

5、在查询或更新操作中,如果涉及到大部分数据(占全表的80%或更多),通常会使用表级锁,而不是行级锁。使用表级锁的原因包括以下几点:

1)效率考虑:当涉及大量数据时,使用行级锁可能导致大量的锁竞争和锁粒度的细化,这会影响性能,因为每个被锁定的行都需要维护锁状态。表级锁的粒度更大,因此更高效。

2)简化锁管理:管理大量行级锁可能会导致锁管理的复杂性增加,因为需要跟踪和管理大量锁对象。表级锁更容易管理,因为只有一个锁对象。

3)避免死锁:行级锁可能导致死锁问题的发生,因为大量的锁定请求可能形成复杂的锁依赖关系。表级锁可以降低死锁风险。

4)操作一致性:当需要执行大规模数据操作(例如,更新表的大部分数据)时,使用表级锁可以确保整个操作是一致的,因为整个表都被锁定,不会发生部分数据被更新而其他部分未更新的情况。