问题是关于mysql事务。
create table tbl1(
id integer,
val integer,
primary key (id)
);
insert into tbl1 (id, val) values (1,2);
我创建了两个同时工作的用户。
USER1 USER2
start transaction;
update tbl1 set val = 3 where id = 1;
delete from tbl2 where id = 1 and val = 3;
commit;
因此,该行不会被删除。怎么解决?我希望删除该行,因为删除查询的时间晚于第一个用户的事务开始。
编辑:实际上行将被删除,所以没有解释为什么会这样。
答案 0 :(得分:3)
@capoluca - 你有一个race condition。没有简单的,一刀切的答案可以解决它。
在您当前的代码中:
a)如果在更新
之前发生,则不会进行删除b)如果在交易期间发生,删除将“撤消”
c)在“更新”事务完成后发生
一种解决方法是锁定表格。
这不一定是可移植到所有数据库,并且可能对性能产生破坏性影响。
另一个解决方案就是“不用担心”。这实际上可能是合法的选择,具体取决于您的业务需求。如果“删除”是批处理作业的一部分,它可能会很好地工作 - 在这种情况下,有问题的记录迟早会被删除。
另一个解决方案是将更新和删除更新
请查看我上面引用的链接,看看对您的情况最有意义的内容。