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

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

当系统使用频繁就会出现插入 *** 作和删除 *** 作同时进行的情况。这个时候插入事务会先将主表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#

锁表一般是长时间占用表导致的,

试着使SELECT语句运行得更快;你可能必须创建一些摘要(summary)表做到这点。

用--low-priority-updates启动mysqld。这将给所有更新(修改)一个表的语句以比SELECT语句低的优先级。在这种情况下,在先前情形的最后的SELECT语句将在INSERT语句前执行。

你可以用LOW_PRIORITY属性给与一个特定的INSERT、UPDATE或DELETE语句较低优先级。

为max_write_lock_count指定一个低值来启动mysqld使得在一定数量的WRITE锁定后给出READ锁定。

通过使用SQL命令:SET SQL_LOW_PRIORITY_UPDATES=1,你可从一个特定线程指定所有的更改应该由用低优先级完成

这个是属于系统遗留问题,也就是一种系统的保护机制。就是为了避免出现这种在线修改系统的 *** 作。

增加字段属于系统的修改 *** 作。尽量不要在线 *** 作,因为可能出现。未知的漏洞。一定要。离线。修改完毕,然后经过测试后。认为已经没有问题了。在。次日的凌晨发一个通知。停机维护。这样才能保证系统的正常运转。

如果在前期设置系统的时候就预留了。热升级的空间。这样才能达到在线 *** 作的目的,而且系统的金融群总是一部分先升级。

很多情况下,你需要使用系统里边的工具集。在线修改表格。原理其实非常的简单,新建的和原表的表格结构。要一模一样。对这个表格进行修改,然后把结构变更的日期。插入进去。而且还建议您尽量在业务的低缝隙进行修改。避免发生不可控的未知状况。

使用说明:

1、如果是用 MySQL + Apache,使用的又是 FreeBSD 网络 *** 作系统的话,安装时候你应按注意到FreeBSD的版本问题,在FreeBSD 的 3.0 以下版本来说,MySQL Source 内含的 MIT-pthread 运行是正常的,但在这版本以上,你必须使用 native threads。

2、如果在 COMPILE 过程中出了问题,请先检查你的 gcc版本是否在 2.81 版本以上,gmake 版本是否在3.75以上。

3、如果不是版本的问题,那可能是你的内存不足,请使用configure--with-low-memory 来加入。

4、如果要重新做你的configure,那么你可以键入rm config.cache和make clean来清除记录。

5、把 MySQL 安装在 /usr/local 目录下,这是缺省值,您也可以按照你的需要设定你所安装的目录。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存