一个事务引起另一个事务的死锁,该事务被选定结束,请重新运行该事务

问题定位和排除思路如下:

1,根据日志定位到报错的地方,确定数据库的查询处报错。可以确定该故障是数据库的死锁问题。

2.  被选择结束的该事务全程都是只有查询.那另一个事务肯定含有写操作。如果两个事务都是查询操作的话,不可能出现死锁的问题。

3。数据库事务的隔离型使用的SqlServer的默认隔离级别。默认隔离级别是读已提交,意思是过写操作加“持续-X锁”,读操作加“临时-S锁”实现。写操作是在该事务结束后,才释放写锁。读操作在读完就立马释放该读锁,不用等到事务结束。

4. 通过搜索整个工程中出现死锁的表,发现只有一个地方有对该表的插入或者更新操作。如果单独对一个表的增删改查操作是出   现死锁的。但是对该表的更新操作的上下文是没有对其他表进行操作了。仔细发现该表A关联了表B.很有可能是一个事务1读A表,应该关联查询下,需要读B表,该事务在获得A表的读锁后,下一步希望获得B表的读锁。一个事务2在写完表B后获得表A的写锁,因为事务1要同时获得A,B表的读锁,才能完成读操作,所以在获得A表的读锁后,因为没有处理完读,所以需要获得B锁来一起完成.事务1在获得A的读锁后等待获得B的读锁。事务2在获得B的写锁后,希望获得A的写锁,所以才出现死锁。

5,通过JDBC的连接数的方法来模拟可能出现的死锁(如果用单元测试用例的话,因为单元测试的事务的边界是方法,就是说一个方法在一个事务里面)。通过多线程跑了多次后,仍然无解。

虽然没有找到最终问题,但是还是把解题思路记下来

,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值