【发布时间】:2021-06-24 11:34:04
【问题描述】:
我遇到的情况涉及我运行的大型销售点/预订系统。客户拥有在发生购买交易时触发更新的运行余额。也就是说,在存储购买单位的表units 上存在插入、更新和删除触发器,每个触发器将客户的购买和付款相加并更新名为customer_balance 的表。保持这些余额更新而不必通过连接不断地计算它们是必不可少的。业务逻辑还规定,有时可以异步发送与单个客户有关的对units 的多个插入或更新。发生这种情况时,可能会导致死锁,其中两个触发器尝试作用于customer_balance 中的同一行。为了防止这种情况,并且由于您不能将事务放入触发器中,有一些非常快速的更新,我称之为LOCK TABLES units WRITE, customer_balance WRITE,然后购买并让触发器运行,然后立即UNLOCK。这种情况发生得很快且偶尔发生,即使在繁忙时段也不会影响性能。
但是。某些季度和年度报告需要在这些相同的表格上运行大量、非常长的SELECTs,有些长达 30 秒。运行报告时,我SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。这似乎有助于缓解报告中防止隐式或行级锁定的许多其他问题。但他们仍然阻止明确的LOCK TABLES 调用。因此,当这些报告在高峰时段运行时,结帐交易可能会在报告运行的整个过程中冻结。
我的问题是:除了将隔离级别设置为READ UNCOMMITTED 之外,还有什么方法可以防止长时间运行的SELECT 阻塞显式写锁?
【问题讨论】:
标签: mysql locking isolation-level