给出两个表:
Company
[id, name, balance
] Employee
[id, name, company_id
] 我想删除一家公司及其依赖项,但我无法原子地这样做,因为在我的真实项目中,公司有多个级别的依赖项,这些依赖项太复杂而无法挤入单个SQL语句中。此外,查看https://stackoverflow.com/a/5598275/14731我不确定单个SQL语句是否是原子的。
相反,我这样做:
SELECT ... FOR UPDATE
与公司关联的所有员工(锁定它们以防止在事务中期进行修改)有一个问题:如何阻止在步骤1和2之间插入引用公司的新记录?根据https://stackoverflow.com/a/3602125/14731 SELECT ... FOR UPDATE
不会阻止插入。理想情况下,我想锁定公司,而不是每种可能指向它的依赖关系锁定。
更新: 我有一个想法,但我不确定它是否有意义。
如果有人想要插入指向公司的新记录,他们可能需要查找以确保其存在。如果我在步骤1之前在公司上SELECT ... FOR UPDATE
,它应该阻止他们的读取,从而延迟后续插入。我有两个问题:
SELECT ... FOR UPDATE
会阻止正常SELECT
次查询吗?如果没有,我必须确保在查找公司时插入线程始终使用SELECT ... FOR UPDATE
。答案 0 :(得分:0)
以下是一种可能的解决方案:
REPEATABLE_READ
隔离或SELECT ... FOR SHARE
)SELECT ... FOR UPDATE
写入锁定行。DELETE
操作完成之前建立新的读锁定。