鉴于以下表格:
create table permissions(id identity);
create table companies(id identity,
permission_id bigint not null,
foreign key(permission_id) references permissions(id) on delete cascade);
create table departments(id identity,
company_id bigint not null,
permission_id bigint not null,
foreign key(company_id) references companies(id),
foreign key(permission_id) references permissions(id) on delete cascade);
删除部门后,我希望以下语句以原子方式执行:
departments
行已删除permissions
行已删除companies
行已删除permissions
行(上一点)已删除问题:
READ_COMMITTED
事务隔离和ON CASCADE DELETE
,那么这些行是作为单个原子语句删除的吗?或者它们是作为单独的删除语句执行的,这些语句容易受到READ_COMMITTED
异常的影响吗?澄清:
permissions
形成Closure Table(例如,用户拥有公司的权限,公司拥有部门的权限,因此用户有权访问部门)。由于层次关系跨越不同类型(即用户,公司,部门),因此权限表不能指向特定类型。因此,公司/部门必须参考许可,而不是相反。CASCADE
负责其余部分,因为它会删除部门的许可,部门和公司,但它'将忽略删除公司的许可。companies
行。第二个连接(触发器)尝试删除与公司关联的permissions
行,但ON CASCADE DELETE
要求它也锁定公司。答案 0 :(得分:0)
除了带有MyISAM和MS Access的mysql之外,它在大多数数据库中是原子的,通常你可以用触发器做你想做的事,但这很奇怪,因为通常是我们想要的相反,我的意思是当一个权限是删除然后删除具有该权限的部门