mySQL事务竞争条件问题

mySQL事务竞争条件问题,mysql,transactions,race-condition,Mysql,Transactions,Race Condition,我有两个并发事务,使用mySQL InnoDB T1: T2: 问题是,T1执行并且行存在,所以它尝试在表B中插入fk到表A,但就在插入之前,T2执行、删除表A行并提交,现在T1将无法在表B中插入,因为表A中不再有行。 T1和T2不应该序列化吗?要么T1先执行,要么T2先执行,但不能两者都混在一起。我知道使用select for update语句来锁定可以解决这个问题,但实际的逻辑要比这复杂得多,完全锁定一个表确实会影响性能。使用for update将使它们序列化。为什么它把桌子完全锁上了?你能

我有两个并发事务,使用mySQL InnoDB

T1:

T2:

问题是,T1执行并且行存在,所以它尝试在表B中插入fk到表A,但就在插入之前,T2执行、删除表A行并提交,现在T1将无法在表B中插入,因为表A中不再有行。
T1和T2不应该序列化吗?要么T1先执行,要么T2先执行,但不能两者都混在一起。我知道使用select for update语句来锁定可以解决这个问题,但实际的逻辑要比这复杂得多,完全锁定一个表确实会影响性能。

使用
for update
将使它们序列化。为什么它把桌子完全锁上了?你能发布表A的相关字段和索引吗?因为ORM,我没有直接使用db,目前正在使用django。
select row from table A
if row exists
    insert row in table B with fk to table A
else
    insert row in table A
    insert row in table B with fk to table A
delete row from table A (same row as T1 is selecting/updating)