什么时候会触发表锁和行锁
表锁(Table Lock)
表锁通常在以下情况下触发:
- 全表操作:如
ALTER TABLE
、DROP TABLE
等涉及整个表的操作。 - 显式加锁:使用
LOCK TABLES
语句显式锁定表。 - 低并发需求:在并发要求不高的场景下,数据库可能自动使用表锁。
行锁(Row Lock)
行锁通常在以下情况下触发:
- 单行操作:如
UPDATE
、DELETE
或SELECT ... FOR UPDATE
等针对特定行的操作。 - 高并发需求:在高并发场景下,数据库通常使用行锁以提高并发性能。
- 索引查询:通过索引查询时,数据库可能只锁定相关行。
死锁处理
死锁原因
死锁通常发生在多个事务互相等待对方释放锁时,例如:
- 事务A锁定行1,请求行2。
- 事务B锁定行2,请求行1。
死锁处理策略
-
超时机制:
- 设置事务超时时间,超时后自动回滚并释放锁。
- 例如,MySQL 通过
innodb_lock_wait_timeout
参数设置超时时间。
-
死锁检测:
- 数据库自动检测死锁并回滚其中一个事务。
- 例如,InnoDB 引擎会自动检测并处理死锁。
-
重试机制:
- 在应用程序中实现重试逻辑,当事务因死锁回滚后,自动重试。
-
锁顺序:
- 确保所有事务按相同顺序获取锁,减少死锁概率。
-
减少事务粒度:
- 将大事务拆分为多个小事务,减少锁竞争。
保证数据不丢失且不影响项目进行
-
事务设计:
- 确保事务简短,减少锁持有时间。
- 避免在事务中进行长时间操作。
-
备份与恢复:
- 定期备份数据,确保死锁回滚后能快速恢复。
-
监控与报警:
- 实时监控数据库状态,及时发现和处理死锁。
- 设置报警机制,快速响应死锁问题。
-
优化查询:
- 使用索引优化查询,减少锁竞争。
- 避免全表扫描,降低锁冲突概率。
-
隔离级别:
- 根据需求选择合适的隔离级别,平衡一致性和并发性。
总结
- 表锁:全表操作或低并发时触发。
- 行锁:单行操作或高并发时触发。
- 死锁处理:通过超时、检测、重试、锁顺序和事务拆分等策略,确保数据不丢失且项目正常运行。
通过这些措施,可以有效减少死锁发生,并在死锁发生时快速恢复,保证系统稳定性和数据完整性。