如何防止插入删除表造成的数据库死锁

在数据库中经常会遇到这样的情况:一个主表A,一个子表B,B表中包含有A表的主键作为外键。当要插入数据的时候,我们会先插入A表,然后获得A表的Identity,再插入B表。如果要进行删除操作,那么就先删除子表B,然后再删除主表A。在程序设计中,对两个表的操作是在一个事务之中完成的。

当系统使用频繁就会出现插入操作和删除操作同时进行的情况。这个时候插入事务会先将主表A放置独占锁,然后去访问子表B,而同时删除事务会对子表B放置独占锁,然后去访问主表A。插入事务会一直独占着A表,等待访问B表,删除事务也一直独占着B表等待访问A表,于是两个事务相互独占一个表,等待对方释放资源,这样就造成了死锁。

遇到这种情况我听说了三种做法:

1 取消AB两个表之间的外键关系,这样就可以在删除数据的时候就可以先删除主表A,然后删除子表B,让对这两个表操作的事务访问顺序一致。

2 删除A表数据之前,先使用一个事务将B表中相关外键指向另外A表中的另外一个数据(比如在A表中专门建一行数据,主键设置为0,永远不会对这行数据执行删除操作),这样就消除了要被删除的数据在AB两个表中的关系。然后就可以使用删除事务,先删除A表中的数据,再删除B表中的数据,以达到和插入事务表访问一致,避免死锁。

3 在外键关系中,将“删除规则”设置为“层叠”,这样删除事务只需要直接去删除主表A,而不需要对子表B进行操作。因为删除规则设置为层叠以后,删除主表中的数据,子表中所有外键关联的数据也同时删除了。

以上三个解决办法都是同事给出的建议,我也不知道到底该使用什么办法才好。

不知道对于这种情况要防止死锁大家还有没有什么其他好办法?

时间: 2024-08-22 15:25:44

如何防止插入删除表造成的数据库死锁的相关文章

mysql批量删除表与清空数据库

 代码如下 复制代码 <?php $hostname ='localhost';      $userid = 'admin';     $password = 'admin';      $dbname = 'admin';      $connect = mysql_connect($hostname,$userid,$password);      mysql_select_db($dbname);      $result = mysql_query("show table sta

关于c语言实现动态顺序表的插入删除

问题描述 关于c语言实现动态顺序表的插入删除 3C #include ""stdafx.h""#includeconst int MAXSIZE = 10;typedef struct{ int *elem; int length; int maxsize;}sqlist;void initList(sqlist *L){ L->elem = (int *)malloc(L->maxsize*sizeof(int)); if (!L->elem)

oracle数据库如何删除表

问题描述 oracle数据库如何删除表 sql语句删的时候都会出现 SQL> drop table crm; drop table crm ORA-00604: 递归 SQL 级别 2 出现错误 ORA-00942: 表或视图不存在 SQL> 的错误,请问怎么删 解决方案 你这个表名正确吗crm show tables; 查看一下司否有这个表 解决方案二: 当前用户登录后,看下时候有这张表吗?确认有表的话,再确认当前用户时候有删表的权限.如果没权限,应该不是报这样的错吧.估计是连访问的这个表的

sql drop用法删除表,删除数据库,删除索引

下面我们来看看我们常用的drop 函数吧,这是在mysql mssql access里面用来删除sql drop用法删除表,删除数据库,删除索引哦面我们来一一步例子吧. drop index 删除索引 access删除索引:DROP INDEX index_name ON table_name mssql删除索引:DROP INDEX table_name.index_name mysql删除索引:ALTER TABLE table_name DROP INDEX index_name DB2/

MSSQL监控数据库的DDL操作(创建,修改,删除存储过程,创建,修改,删除表等)_MsSql

前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理起来就会相当麻烦,容易产生混乱,如果数据库管理员不监控数据库架构变更的话,就不知道谁对数据库架构做了啥改动(此处改动仅仅只DDL操作),尤其有时候,有些开发人员可能不按规章制度办事,绕过或忘了通知发布人员或DBA,直接去生产机做一些DDL操作,那么我们就需要对数据库架构某些更改的事件进行监控,如果能够

java-链表插入删除顺序问题

问题描述 链表插入删除顺序问题 Java新手,现在在学习链表,发现链表的插入和删除操作不能很好的掌握,不参考代码不知道先修改哪一个reference,再比如在单链表头插入连接点,代码如下 newLink.next = first; first = newLink: 书上写第一行的first是旧的first,第二行的是新的,都是first怎么还分新旧? 所以请教大家添加和删除连接点有什么通用的原则吗?怎样才能灵活的掌握各个连接点引用的修改? 解决方案 就是一个赋值. a的下一个节点=b; b=a;

浅析Oracle数据库闪回删除表原理

首先你应该明白闪回删除操作的对象仅仅是表,它允许你将之前删除的表恢复到删除它之前的状态,同时还会恢复所有索引以及任何权限和触发器,唯一的主键和非空约束也会被恢复(注意不包括外键). Oracle 10g开始,drop table 命令的实现方式为:它实际上根本没有删除表,而只是重命名表,并把重命名的表放进回收站(每个用户都有一个回收站)可以在user_recyclebin数据字典中查看当前用户的回收站中的内容,如:被drop的表重命名后的表名 以及drop之前的名字等等信息, 我们已经知道rna

如何查找、删除表中重复的记录

重复 如何查找.删除表中重复的记录软件环境: 1.Windows NT4.0+ORACLE 8.0.42.ORACLE安装路径为:C:\ORANT问题提出: 1.当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功. 方法原理: 1.Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件.块.行上. 2.在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中 那

在Oracle中如何删除表中设计重复数据

oracle|设计|数据|重复 我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢? 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样. 一.对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧. 下面语句可以查询出那些数据是重复的: select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 将上面的>号改为=号就可以查询