Spring事务死锁

阅读: 评论:0

Spring事务死锁

Spring事务死锁

今天同时导入两个比较耗时的批量操作,系统抛出了异常如下

 org.springframework.dao.DeadlockLoserDataAccessException: 

### Error updating database.  Cause: java.sql.SQLException: ORA-00060: 等待资源时检测到死锁

 

### The error may involve importPhoto.updateStudentPhoto-Inline

### The error occurred while setting parameters

### Cause: java.sql.SQLException: ORA-00060: 等待资源时检测到死锁

 

; SQL []; ORA-00060: 等待资源时检测到死锁

; nested exception is java.sql.SQLException: ORA-00060: 等待资源时检测到死锁

 

数据分析:

1.两个导入都修改了同一个表的数据

2.两个导入内容包含了相同的数据

3.两个导入的数据顺序不相同,是乱序的

两个导入都导入了1w条数据,导入1耗时3分钟左右,导入2耗时10分钟左右,意识到可能是事务死锁了。

原因分析:
    首先死锁是怎么发生的:
   简单说,两个或多个并发事务相互等待,互补想让,没有外力就无法继续下去,这就制造了死锁。数据库检测到死锁时,就会将死锁的各个事务回滚,并抛出ORA-00060异常。所以上面报错出现的情况极少,将死锁解除后又可以正常运行。

解决思路:
    死锁是无法根除的,特别在高并发的系统中。只有尽可能优化速度,减少互相等待的机会。原则为:执行速度越快越好,访问资源时锁的范围越小越好。根据这个原则就可以优化我们的sql,将负责的sql拆分,若果业务允许的情况下。还有事务越小越好。

解决技巧:
        1,出现死锁异常后,手工将死锁解开。
        2,找出造成死锁的sql:
            a,直接看日志:程序中日志做的很详细的话,是能够找到具体哪个sql报的错,操作的哪个表,还有别的模块也操作这个表,线程,并发的程序也会引起。
            b,通过oracle的后台v$session表 和 v$sql 的分析 找到。  
        3,对sql进行优化。   

 

本文发布于:2024-02-02 04:04:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170681799041239.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:死锁   事务   Spring
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23