1

问题是关于 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;

因此,该行不会被删除。如何解决?我希望该行将被删除,因为删除查询晚于第一个用户的事务开始。

编辑:实际上行将被删除,所以没有解释为什么会这样。

4

1 回答 1

3

@capoluca - 你有一个比赛条件。没有简单的、万能的答案可以解决它。

  • 在您当前的代码中:

    a) 如果在更新之前发生,则不会删除

    b) 如果在事务期间发生删除,则删除将被“撤消”

    c)如果在“更新”事务完成发生删除,则将进行删除

  • 一种解决方案是锁定表。

    这不一定适用于所有数据库,并且可能对性能产生毁灭性影响。

  • 另一个解决方案是简单地“不用担心”。这实际上可能是一个合理的选择,具体取决于您的业务需求。如果“删除”是批处理作业的一部分,它可能会工作得很好——在这种情况下,有问题的记录肯定迟早会被删除。

  • 另一种解决方案是将更新和删除放在它们自己的单独事务中

请查看我上面引用的链接,看看什么对您的情况最有意义。

于 2012-09-24T20:08:25.927 回答