事务中的mysql外键更新约束?

时间:2012-01-19 21:02:36

标签: mysql transactions foreign-keys atomic

我找不到关于此的官方mysql解释,所以我想把它扔到这里。 如果我在MySQL中的两个表之间有外键约束,比如tableA是父表,tableB是子表。并且,在父表A上,我将使用“ON UPDATE CASCADE ON DELETE CASCADE”来确保MySQL自动将更新/删除操作应用于子表B.

现在,我的问题是:如果对子表和父表的更新是否在事务中? 或者通过使用以下陈述,任何差异?

方法1: 更新表A SET col1 =“A”和col2 =“B”;

方法2: 开始; UPDATE tableA SET col1 =“A”,col2 =“B”; 提交;

现在,我遇到了method1中的问题:当tableA更新时,tableB可能需要很长时间来更新其相应的列(当然不是在事务中)。 有人遇到过类似的问题吗?

2 个答案:

答案 0 :(得分:0)

假设您的所有表都使用InnoDB,那么您在事务中执行的几乎所有操作都将被该事务覆盖并可以回滚。像DROP TABLE这样的事情做了隐式提交。但是对于select / update / insert / delete,它都被覆盖了。

包括由外键级联关系触发的任何插入/更新/删除。

答案 1 :(得分:0)

  

说tableA是父表,tableB是子表。而且,在   父表A,我将使用“ON UPDATE CASCADE ON DELETE CASCADE”来   确保更新/删除操作可以应用于子tableB   MySQL自动。

如果tableA有ON UPDATE CASCADE ON DELETE CASCADE,则tableA是“child”,而不是“parent”。 (SQL不使用术语“父”和“子”; tableA是引用表,tableB是引用的表。)对引用列的更改tableB将自动应用于tableA中的匹配值。

create table tableB (
  column_a char(2) primary key
);

create table tableA (
  column_a char(2) not null 
    references tableB (column_a) 
    on update cascade
    on delete cascade,
  column_b char(2) not null,
  primary key (column_a, column_b)
);

insert into tableB values ('aa');
insert into tableA values ('aa', 'bb');

update tableB 
set column_a = 'cc' 
where column_a = 'aa';

select *
from tableA;

column_a   column_b
--
cc         bb

由于外键引用而级联的更新是单个事务。 SQL必须以这种方式工作。如果更新是两个事务 - 一个用于引用表,另一个用于引用表 - 并且对引用表的更新失败,则会使数据库处于不一致状态。 (例如,在上面的更新中,因为'aa'在tableB中会更改为'cc',但不会在tableA中更改.dbms不能让这种情况发生。)