我们登上的并非我们所选择的舞台,演出并非我|

PromiseForYou

园龄:4个月粉丝:0关注:0

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. 隔离级别

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

总结

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

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

本文作者:PromiseForYou

本文链接:https://www.cnblogs.com/promiseforyou/p/18702550

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   PromiseForYou  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起