在数据库中经常会遇到这样的情况:一个主表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进行操作。因为删除规则设置为层叠以后,删除主表中的数据,子表中所有外键关联的数据也同时删除了。

转载于:https://www.cnblogs.com/qjlyp/archive/2007/06/12/780271.html

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

  1. oracle数据库插入多表,在Oracle数据库中插入嵌套表

    我是PL/SQL数据库的新学习者,这是一种给apex.oracle.com上的数据库应用指定序列的练习.然后我创建了表格,但是当填充与插入的代码如下所示,应用赋予错误,表你不介意,我需要你的帮助在Or ...

  2. SAP License:SE16如何删除或合修改数据库表

    方法一:tcode:se16n, 输入要删除数据的自定义表名,回车.进入后,在命令框中输tcode:&sap_edit,回车,点击运行,即可进入修改界面. 或者 SE38 + LSE16NO0 ...

  3. SQL Server数据库表的基本操作(批量插入、删除、查询数据,删除表中重复数据方法)

    实验名称:数据库表的基本操作与表内数据操作 实验目的: 掌握数据库表创建方法(交互式.T-SQL法) 掌握修改数据库表结构的方法 掌握删除数据库表的方法 掌握交互式EXCEL文件录入数据至数据库表的方 ...

  4. SQL数据库插入、修改、删除及删除表中数据操作示例(insert、update)

    目录: 1.数据库的连接.创建 2.对字段的操作:(alter table) 3.SQL数据库插入.修改.删除操作 4.数据库的查询操作大全(select) 5.多表查询(join on) 6.约束操 ...

  5. 数据库基础--数据库基础管理(创建库/表 以及插入修改删除表数据)

    1.啥子是数据库–存储数据的仓库 2.什么是数据–音乐,电影,文本,图片等 常见的数据库软件 Oracle 不开源 跨平台 厂商:甲骨文 MySQL 开源 跨平台 厂商:甲骨文 SQL Server ...

  6. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表

    1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...

  7. MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...

    本文主要向大家介绍了SQLServer数据库sql语句中----删除表数据drop.truncate和delete的用法,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 虽 ...

  8. PLSQL如何将千万数据快速插入到另一张表中_数据库设计中的 9 大常见错误

    作为数据库设计人员,当我们负责数据库项目时,在数据库设计以及把数据库部署到生产环境的过程中可能会遇到一些挑战. 其中一些问题不可避免,也无法控制.但是,其中相当一部分可以追溯到数据库设计本身的质量.我 ...

  9. 数据库mysql中对于drop_数据库之删除表数据drop、truncate和delete的用法

    数据库中删除表数据的关键字,最常用的可能就是delete了,另外其实还有drop和truncate两个关键字. 老大:drop 命令格式:drop table  tb  ---tb表示数据表的名字,下 ...

最新文章

  1. 依赖注入?依赖注入是如何实现解耦的?
  2. ML:MLOps系列讲解之《基于ML的软件的三个层次之02 Model: Machine Learning Pipelines——2.6 ML Model serialization forma》解读
  3. 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)
  4. zookeeper的设计猜想-leader选举
  5. C# String和string的区别
  6. 外显子和基因组基本概念(一)
  7. 【BZOJ3616】War,KD树+bitset压位
  8. apache缓存php页面不改变,Apache服务器禁止静态文件缓存的实现方法
  9. centos7 nginx php5.4,详解CentOS7.0下Nginx+PHP5.4+MySQL5.5+Memcached+Redis的架构部署
  10. R语言--自定义函数证明中心极限定理
  11. 千万不能返回局部变量的引用
  12. C#基础与VB基础比较
  13. 数值方法与计算机方法是,计算机数值方法.pdf
  14. 如何查找hp计算机的生产日期,旗捷支招 | 如何识别惠普打印机的生产日期
  15. MCS51单片机的输入/输出接口
  16. 听说掌握这些利器,运维就能运筹帷幄
  17. 拿到offer后 还应该继续去面试?
  18. 【翻译】Bing-CF-IDF+:语义驱动的新闻推荐系统
  19. Flutter iOS问题记录 - Fastlane打包的ipa包上传fir后不显示应用版本名称
  20. 热门Java开发工具IDEA入门指南——IntelliJ IDEA概述(下)

热门文章

  1. 如何使用facenet详解_如何使用冰箱更节能 使用冰箱节能技巧介绍【详解】
  2. for ie无效 in js_关于js中for in的缺陷浅析
  3. 2020 华工 数据结构-平时作业_【激光】从上海工博会看华工激光的差异化路线...
  4. python按字节读取_Python read函数按字节(字符)读取文件的实现
  5. 一文通吃所有整流滤波电路
  6. 单片机的程序有多大?
  7. 详解PCB抄板过程,太牛了!
  8. 他们和机器人啪啪啪,并计划共度一生
  9. 「权威发布」2019年大学生电子设计竞赛题目
  10. 天骄2 mysql错误_凤舞天骄一键版和钟隐3合1版的大多数问题解决方案