2020-11-15 08:17:15
该数据库锁问题可能是由交叉锁(Cross Lock)引起的。以下是对问题的详细分析:
用户反馈的SQL语句涉及对st_salesouts表的更新操作,且并发量很高。
日志显示,某些请求的执行时间非常长,甚至接近10分钟,这可能是由于会话超时自动终止导致的。
慢查询主要发生在同一个租户(tenantid:zh1m6mmb),这表明问题可能与该租户的特定操作有关。
用户提到,即使后台批处理任务结束,锁的问题仍然存在,这表明问题可能与交叉锁有关。
用户提到的SQL语句涉及对多个ID的更新,如果这些更新操作没有按照一致的顺序执行,可能会导致交叉锁。
例如,事务T1更新ID1和ID2,而事务T2更新ID2和ID1,如果它们的执行顺序交叉,就可能形成交叉锁。
对更新ID进行排序:确保所有事务按照相同的顺序更新ID,这样可以避免交叉锁的发生。例如,总是先更新较小的ID,再更新较大的ID。
启用死锁检测:如果可能,重新启用数据库的死锁检测机制,以便自动检测和解决交叉锁问题。
优化SQL语句:检查并优化SQL语句,确保它们高效且不会导致不必要的锁争用。
监控和分析:持续监控数据库的锁情况,分析慢查询日志,以便及时发现并解决潜在的锁问题。
综上所述,该数据库锁问题很可能是由交叉锁引起的,特别是在死锁检测被关闭的情况下。通过确保更新操作的顺序一致、优化SQL语句以及持续监控数据库锁情况,可以有效地解决这个问题。