并发错误:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品
这个是并发情况下导致的数据库事务错误,先介绍下背景。
背景
springboot+springmvc+sqlserver+mybatis
一个controller里有五六个接口,这些接口都用到了spring的事务管理,这些接口单个调用的时候都很正常,当我模拟几十个并发请求这些接口的时候,总会有一两次的mybatis的持久化操作会出错,具体错误:
nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.lang.reflect.UndeclaredThrowableException
### The error may involve com.xxxxxxxxx-Inline
### The error occurred while setting parameters
### SQL: update xxxx set ccccc = ? ,jid = ? ,status = ? where bcode=? and status != 0
### Cause: java.lang.reflect.UndeclaredThrowableException
根据提示的这个UndeclaredThrowableException,到网上搜索都是说mybatis的映射文件里的字段属性与model里的写的不一致。
但是如果是写法不对的话,应该每次请求的都报错啊,现在是几十次里只有一两次报错,肯定不是这个原因。
在网上搜了半天,无果,于是把代码放到服务器上再模拟并发测试一下,还是会有一两次报错,不过这次报的错就很明朗了
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 事务(进程 ID 62)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
### The error may exist in file [E:\kkkkk\xxxMapper.xml]
### The error may involve com.xxxxx.ppppp
### The error occurred while handling results
### SQL: SELECT b.* FROM xxxxx a RIGHT JOIN ooooo b ON a.GId = b.id where a.bcode = ''
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 事务(进程 ID 62)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
; SQL []; 事务(进程 ID 62)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 事务(进程 ID 62)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
原来是并发引起的数据库事务报错,具体原因和修改看这篇:对于spring中事务@Transactional注解的理解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我了解了一下事务处理机制,原来这个错误是在数据库中抛出的。因为不同线程在事务中处理相同的数据时,数据库会采取让一个执行而另一个放弃执行,于是就出现上面的错了。之所以插入不容易出现这个错误,是因为插入的速度快,不容易出现。同时如果修改的时候按照条件修改数据速度就会慢,如果按照主键或索引修改速度就会快,也不容易出现这个错误。@xmt1139057136,虽然没给具体的方法确实是按照这个思路想出来的,谢谢啦。对了,我对TOMCAT在局域网内进行压力测试时,发现速度明显比本地慢的多,而且无法处理并发1000条了(本机是可以的),向请教一下。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方法
2.把事务的隔离级别改为宽松的,read_uncommited
并发错误:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品的更多相关文章
- 读写分离,读写分离死锁解决方案,事务发布死锁解决方案,发布订阅死锁解决方案|事务(进程 ID *)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务
前言: 由于网站访问压力的问题,综合分析各种因素后结合实际情况,采用数据库读写分离模式来解决当前问题.实际方案中采用“事务发布”模式实现主数据库和只读数据库的同步,其中: 发布服务器1 ...
- 事务(进程 ID 64)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。
访问频率比较高的app接口,在后台写的异常日志会偶尔出现以下错误. 事务(进程 ID 64)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务 实所有的死锁最深层的原因就是一个 ...
- C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别
C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye { //私有的构造函数,保证外部不能实例化 private ...
- Kettle 解决数据锁的问题(事务(进程 ID 51)与另一个进程被死锁在 锁 资源上)
1.Kettle做了一个作业, 执行的时候问题发生在步骤2和步骤3之间,也就是步骤2还未完全执行完的时候,步骤3就要更新步骤2插入的数据,造成死锁.(我的理解是既然都分开作业了,那么每个作业都是一个单 ...
- SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。
### The error occurred while setting parameters### SQL: update ERP_SCjh_zzc_pl set IF_TONGBU=1 where ...
- 如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?
如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存.文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单? 目录 如何按名称或PID查找一个进程?如何按端 ...
- linux -- 进程的查看、进程id的获取、进程的杀死
进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps a ...
- Linux下查找进程id并强制停止进程的脚本
Linux下的tomcat的停止脚本shutdown.sh经常失败,造成tomcat进程没关闭.所以只能手动查找进程id,然后用kill命令来强制停止.每次都要这样查一下,然后再杀进程.感觉有点麻烦, ...
- CMD查看进程ID并查杀进程
开始-运行,输入CMD打开命令行界面,输入命令netstat -ano 结束该进程C:\>taskkill /f /t /im Wiz.exe 根据进程ID杀 >taskkill /F / ...
随机推荐
- POJ1595 Prime Cuts
Prime Cuts Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11961 Accepted: 4553 Descr ...
- 更改MVC3默认错误提示信息 模型验证 validation
原文发布时间为:2011-07-20 -- 来源于本人的百度文章 [由搬家工具导入] Model Metadata and Validation Localization using Conventi ...
- div两侧的boder断开 消失 奇怪
原文发布时间为:2009-11-06 -- 来源于本人的百度文章 [由搬家工具导入] 解决方法: 设定外层DIV的宽度即可,如 width:99% ========================== ...
- transfered jquery plugin practice!
jQuery插件开发入门 发表于 2014年05月23日 by 天涯孤雁 被浏览 20,897 次 ======2014-5-27 更新======= Require.js中使用jQuery 插件请查 ...
- CentOS下VNC使用
1. 介绍 本文主要介绍了VNC Server的配置和使用 2. 安装 CentOS中默认就有安装VNC,可以通过命令rpm查看 [Jerry@localhost ~]$ rpm -qa | grep ...
- python3列表推导式和生成器。
1.把一个字符串变成 Unicode 码位的列表 >>> symbols = '$¢£¥€¤' >>> codes = [] >>> for sy ...
- Codeforces Round #315 (Div. 2)【贪心/重排去掉大于n的元素和替换重复的元素】
B. Inventory time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- bzoj 1412: [ZJOI2009]狼和羊的故事
http://www.lydsy.com/JudgeOnline/problem.php?id=1412 超级源点连向所有的狼,超级汇点连向所有羊,流量为INF 相邻连边流量为1,最小割 #inclu ...
- gradients的一些注意点
Each variable has a [.grad_fn] attribute that references a Function that has created the Variable(ex ...
- js 面试的坑:变量提升
全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. ...