暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于数据库的死锁

www 2024-08-15
170

不知道其他人对于数据库死锁的理解是如何。就简单说一下我的理解吧


如果有人问,系统为什么会有死锁,要怎么排查。


当我想拿现实中的事件去举例说明事物的时候,发现没有一件能够非常贴切的形容这一现象。


死锁的原因在于,为了保证事务的一致性。将多个分开的原子操作,装在一个具有原子性的事务中。现实生活中是不存在这样一个事物的。


所以只能用最基本的现象描述:

A进程更新了数据库的a1行,等待更新b1行

B进程更新了数据库的b1行,等待更新a1行

双方形成了互斥的情况。

互斥如果发生在数据库中,ORACLE数据库可以实现死锁检测和回滚其中一个事物。

会话层面提示:

ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource


但在执行中的代码,一般没有死锁的处理逻辑,就会一直占用着。导致应用会产生更多的行锁,最终将应用的session占满,导致数据库无法正常提供服务。 






被锁时间前后1个小时的awr,然后通过awr的top event和 row lock segment ,就可以知道被锁的表。被阻塞的语句,然后把信息给到开发去改代码。

业务如果在运行中,就和业务负责人沟通后,先杀把产生阻塞的会话都杀掉。保证业务正常运行。

另外我们也可以通过自定义的存储过程,实现自动检测死锁,杀掉产生死锁的session,并将阻塞的语句记录掉数据库中。


基本能做的就这些了。 

更多操作命令可以查看以下链接:

https://mp.weixin.qq.com/s?__biz=MjM5MzExMTU2OQ==&mid=2650603515&idx=1&sn=275956ad38d26168e44027336644e5a0&scene=2&srcid=0711qxhIykeqO278x7VZFx5k&from=timeline&isappinstalled=0#wechat_redirect


开发应该就会去做代码走查,查看有可能出现死锁的代码。

java中死锁的场景,开发可以参考查看一下链接:

https://developer.aliyun.com/article/829551

最后修改时间:2024-08-15 15:46:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论