我找不到官方的mysql对此的解释,所以我想把它扔在这里。如果我在MySQL中的两个表之间有外键约束,假设tableA是父表,tableB是子表。并且,在父tableA上,我将使用"ON UPDATE CASCADE on DELETE CASCADE“来确保MySQL可以自动对子tableB应用更新/删除操作。
现在,我的问题是:对子表和父表的更新是否在事务中?或者使用下面的语句,有什么区别吗?
方法2: Begin;更新tableA SET col1="A“和col2="B";Commit;
现在,我在method1中遇到了问题:当更新tableA时,tableB可能需要很长时间来更新其相应的列(肯定不是在事务中)。以前有没有人遇到过类似的问题?
发布于 2012-01-20 05:05:59
假设您的所有表都在使用InnoDB,那么您在事务中执行的几乎所有操作都包含在该事务中,并且可以回滚。有些事情,比如DROP TABLE执行隐式提交。但是对于select/update/insert/delete,所有内容都包含在内。
这包括由外键级联关系触发的任何插入/更新/删除。
发布于 2012-01-20 07:50:51
说tableA是父表,tableB是子表。并且,在父tableA上,我将使用"ON UPDATE CASCADE on DELETE CASCADE“来确保MySQL可以自动对子tableB应用更新/删除操作。
如果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必须以这种方式工作。如果更新是两个事务--一个用于被引用表,另一个用于引用表--并且对引用表的更新失败,则会使数据库处于不一致的状态。(例如,在上面的更新中,因为在tableB中'aa‘将更改为'cc’,但在tableA中不会。dbms不会让这种情况发生。)
https://stackoverflow.com/questions/8933228
复制相似问题