mysql,一个用户删除,另一个更新,谁将获胜?

时间:2012-09-24 19:59:15

标签: mysql

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

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

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

1 个答案:

答案 0 :(得分:3)

@capoluca - 你有一个race condition。没有简单的,一刀切的答案可以解决它。

  • 在您当前的代码中:

    a)如果更新

    之前发生,则不会进行删除

    b)如果在交易期间发生,删除将“撤消”

    c)“更新”事务完成后发生

  • 一种解决方法是锁定表格。

    这不一定是可移植到所有数据库,并且可能对性能产生破坏性影响。

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

  • 另一个解决方案是将更新删除更新

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