数据库中解决死锁的常用方法有什么

数据库中解决死锁的常用方法有什么,第1张

1、要求每个事务一次就将所有要使用的数据全部加锁,否则不能执行。

2、采用按序加锁法.预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁。

3、不采取任何措施来预防死锁的发生,而是周期性地检查系统中是否有死锁.如果发现死锁就设法解除。

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

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

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

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

1

多了一次更新 *** 作,2还可以

,一般插入时不需要使用事务,删除时用cascade

插入时可能出现的数据不完整,在读取时作验证,不完整数据直接忽略,跑作业定期清理。因为无论插入时使用不使用事务,读取时都要作验证以确保数据正确性而不致程序出错,对应的定期数据清理也是必不可少的,所以并不会因为插入时不使用事务而造成过多的数据库访问。用方法2,并规范相关 *** 作的调用,比如通过权限设定限定删除 *** 作不会被随意执行,更大程度上避免误删。第2种做法是值得推荐的做法,虽然具有一定性能影响,但是从数据的一致性考虑,是最佳的。

察看死锁

select

sess.sid,

sess.serial#,

lo.oracle_username,

lo.os_user_name,

ao.object_name,

lo.locked_mode

from

v$locked_object

lo,

dba_objects

ao,

v$session

sess

where

ao.object_id

=

lo.object_id

and

lo.session_id

=

sess.sid

order

by

ao.object_name

清除死锁

alter

system

kill

session

sid,.serial#


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6670753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存