标签:思路 ted app nsa trace read task 命中 adl
两条SQL命中的记录各三条。一看是死锁,第一反应是发生记录资源互斥等待。猜想会不会是这6行记录在执行update的时候SQL1和SQL2修改的记录发生了互斥
菜瓜:所以你最开始想的是更新时两条SQL获取记录的顺序反了,譬如说SQL1先拿35610742,再拿35610744前,SQL2先把35610744拿到了且它要拿35610742在阻塞
水稻:是的,但是很快发现这个思路很离谱,我们说锁的时候应该是和索引联系起来,分析记录就有点偏了。而且按记录来看,两个SQL命中的记录都不一样。于是回到索引上,就能说通他们都命中了from=‘1‘这个条件,在idx_from上发生了互斥。
菜瓜:soga,真实情况呢
水稻:事情如果这么简单我就不会研究它好几天了。分析完了之后开始准备复现死锁。思路很简单,因为SQL只有一句,要模拟出来就用多线程并发执行
@Resource
private DeadlockMapper deadlockMapper;
@Resource
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Test
public void deadlock() {
for (; ; ) {
threadPoolTaskExecutor.execute(() -> {
try {
Long id = 35611183L;
String from = "1";
String to = "2";
deadlockMapper.updateDeadlock(id, from, to);
} catch (Exception e) {
System.out.println("transaction tututu");
e.printStackTrace();
System.exit(0);
}
});
threadPoolTaskExecutor.execute(() -> {
try {
Long id = 35610745L;
String from = "1";
String to = "c";
deadlockMapper.updateDeadlock(id, from, to);
} catch (Exception e) {
System.out.println("transaction kakaka");
e.printStackTrace();
System.exit(0);
}
});
System.out.println("once loop finish ...");
}
}
标签:思路 ted app nsa trace read task 命中 adl
原文地址:https://www.cnblogs.com/newvdgh/p/13276927.html