您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> .NET >> 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品

事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品

来源:网络整理     时间:2016/5/7 2:49:41     关键词:lock

关于网友提出的“事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品”问题疑问,本网通过在网上对“事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品
描述:

数据库java事务压力测试

我用java做数据库操作,在一个方法中开启事务,在事务中先查询数据是否存在,如果存在则修改,不存在则添加,当我用1000个线程测试时就报了如上的错误。经测试发现单纯的插入比修改出现上面异常的概率低得多,真的很不解。
事务开启后其他的事务还能访问这个事务中的表吗?
我们公司用的是数据库层中间件是公司写的,不方便拿出来,拜求大家了
解决方案1:

数据库的数据量大吗?
查询需要多久?
方法上加锁,或者在创建触发器来搞定。
本人对这些不是太懂。

解决方案2:

可以考虑尽量采用单SQL操作,并尝试放弃使用事务,伪代码如下:
1、先执行条件式Update,也就是先尝试更新该记录的信息,条件必须有索引,否则锁全表代价太高;
2、检查Update返回的记录数,如果是1,说明修改成功,可以结束了。
3、如果是0,说明没有这条记录,那么就执行Insert;
4、如果第3步Insert因为记录重复而失败,那么说明刚好有条并发操作已经增加了该行记录,此时可以直接放弃此次操作(反正记录已经有了),也可以再次跳回1进行执行(如果打算继续更新)。
上述过程可以不需要开启批事务,也不会有啥致命问题。
当然,如果发现你的Update居然返回大于1,说明你程序设计有问题或数据有问题,导致同时发生多条记录修改。


以上介绍了“事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/951059.html

相关图片

相关文章