标签:思路 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