【问题标题】:mysql foreign key update constraint in a transaction?事务中的mysql外键更新约束?
【发布时间】:2012-01-19 21:02:35
【问题描述】:

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

现在,我的问题是:对子表和父表的更新是否在事务中? 或者通过使用以下语句,有什么不同吗?

方法一: UPDATE tableA SET col1="A" and col2="B";

方法二: 开始; UPDATE tableA SET col1="A" and col2="B"; 提交;

现在,我遇到了方法 1 中的问题:当 tableA 更新时,tableB 可能需要很长时间才能更新其对应的列(肯定不是在事务中)。 有人遇到过类似的问题吗?

【问题讨论】:

    标签: mysql transactions foreign-keys atomic


    【解决方案1】:

    假设您的所有表都使用 InnoDB,那么您在事务中执行的几乎所有操作都被该事务覆盖并且可以回滚。诸如DROP TABLE 之类的东西会进行隐式提交。但是对于 select/update/insert/delete,都涵盖了。

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

    【讨论】:

    • 是的,两个表都在 innoDB 中。据我了解,每条语句都是 InnoDB 中的一个事务。那么,为什么在 mehtod1 中,对两个表的更新不是原子的?
    • 级联更新将是初始操作的一部分,因此是原子的。
    • 我找不到任何有关此的 MySQL 文档。而且,根据我自己的实验,在方法 1 中,对两个表的更新不是原子的。
    【解决方案2】:

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

    如果 tableA 有ON UPDATE CASCADE ON DELETE CASCADE,那么 tableA 是“子”,而不是“父”。 (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 不能让这种情况发生。)

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多