Mysql篇之锁

什么时候会触发表锁和行锁

表锁(Table Lock)

表锁通常在以下情况下触发:

  1. 全表操作:如 ALTER TABLEDROP TABLE 等涉及整个表的操作。
  2. 显式加锁:使用 LOCK TABLES 语句显式锁定表。
  3. 低并发需求:在并发要求不高的场景下,数据库可能自动使用表锁。

行锁(Row Lock)

行锁通常在以下情况下触发:

  1. 单行操作:如 UPDATEDELETESELECT ... FOR UPDATE 等针对特定行的操作。
  2. 高并发需求:在高并发场景下,数据库通常使用行锁以提高并发性能。
  3. 索引查询:通过索引查询时,数据库可能只锁定相关行。

死锁处理

死锁原因

死锁通常发生在多个事务互相等待对方释放锁时,例如:

  • 事务A锁定行1,请求行2。
  • 事务B锁定行2,请求行1。

死锁处理策略

  1. 超时机制

    • 设置事务超时时间,超时后自动回滚并释放锁。
    • 例如,MySQL 通过 innodb_lock_wait_timeout 参数设置超时时间。
  2. 死锁检测

    • 数据库自动检测死锁并回滚其中一个事务。
    • 例如,InnoDB 引擎会自动检测并处理死锁。
  3. 重试机制

    • 在应用程序中实现重试逻辑,当事务因死锁回滚后,自动重试。
  4. 锁顺序

    • 确保所有事务按相同顺序获取锁,减少死锁概率。
  5. 减少事务粒度

    • 将大事务拆分为多个小事务,减少锁竞争。

保证数据不丢失且不影响项目进行

  1. 事务设计

    • 确保事务简短,减少锁持有时间。
    • 避免在事务中进行长时间操作。
  2. 备份与恢复

    • 定期备份数据,确保死锁回滚后能快速恢复。
  3. 监控与报警

    • 实时监控数据库状态,及时发现和处理死锁。
    • 设置报警机制,快速响应死锁问题。
  4. 优化查询

    • 使用索引优化查询,减少锁竞争。
    • 避免全表扫描,降低锁冲突概率。
  5. 隔离级别

    • 根据需求选择合适的隔离级别,平衡一致性和并发性。

总结

  • 表锁:全表操作或低并发时触发。
  • 行锁:单行操作或高并发时触发。
  • 死锁处理:通过超时、检测、重试、锁顺序和事务拆分等策略,确保数据不丢失且项目正常运行。

通过这些措施,可以有效减少死锁发生,并在死锁发生时快速恢复,保证系统稳定性和数据完整性。

posted @ 2025-02-07 14:46  PromiseForYou  阅读(27)  评论(0)    收藏  举报