问题定位和排除思路如下:
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的连接数的方法来模拟可能出现的死锁(如果用单元测试用例的话,因为单元测试的事务的边界是方法,就是说一个方法在一个事务里面)。通过多线程跑了多次后,仍然无解。
虽然没有找到最终问题,但是还是把解题思路记下来
,