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

阳光的黑脸哥

阳光的黑脸哥

2016-02-19 18:02

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的如何防止插入删除表造成的数据库死锁懂设计的网友们快点来了解吧!

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

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

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

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

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

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

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

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
如何防止插入删除表造成的数据库死锁

如何从MYSQL数据库中删除表

编程语言 网络编程
如何从MYSQL数据库中删除表

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何还原数据库 如何恢复数据库删除数据

网络
如何还原数据库 如何恢复数据库删除数据

减少SQL Server数据库死锁的方法

编程语言 网络编程
减少SQL Server数据库死锁的方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle数据库删除两表中相同数据的方法

电脑网络
Oracle数据库删除两表中相同数据的方法

如何修复MySQL数据库表

编程语言 网络编程
如何修复MySQL数据库表

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

关于Got a packet bigger than ‘max_allowed_packet‘

关于Got a packet bigger than ‘max_allowed_packet‘

完美解决mysql中文乱码的问题

完美解决mysql中文乱码的问题
下拉加载更多内容 ↓