不知道其他人对于数据库死锁的理解是如何。就简单说一下我的理解吧
如果有人问,系统为什么会有死锁,要怎么排查。
当我想拿现实中的事件去举例说明事物的时候,发现没有一件能够非常贴切的形容这一现象。
死锁的原因在于,为了保证事务的一致性。将多个分开的原子操作,装在一个具有原子性的事务中。现实生活中是不存在这样一个事物的。
所以只能用最基本的现象描述:
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,并将阻塞的语句记录掉数据库中。
基本能做的就这些了。
更多操作命令可以查看以下链接:
开发应该就会去做代码走查,查看有可能出现死锁的代码。
java中死锁的场景,开发可以参考查看一下链接:
最后修改时间:2024-08-15 15:46:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




