标签:String idx 记录 条件 System 互斥 SQL id
-
两条SQL命中的记录各三条。一看是死锁,第一反应是发生记录资源互斥等待。猜想会不会是这6行记录在执行update的时候SQL1和SQL2修改的记录发生了互斥
菜瓜:所以你最开始想的是更新时两条SQL获取记录的顺序反了,譬如说SQL1先拿35610742,再拿35610744前,SQL2先把35610744拿到了且它要拿35610742在阻塞
水稻:是的,但是很快发现这个思路很离谱,我们说锁的时候应该是和索引联系起来,分析记录就有点偏了。而且按记录来看,两个SQL命中的记录都不一样。于是回到索引上,就能说通他们都命中了from='1'这个条件,在idx_from上发生了互斥。
菜瓜:soga,真实情况呢
水稻:事情如果这么简单我就不会研究它好几天了。分析完了之后开始准备复现死锁。思路很简单,因为SQL只有一句,要模拟出来就用多线程并发执行
- Java Code
-
@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 ..."); } }
-
-
标签:String,idx,记录,条件,System,互斥,SQL,id 来源: https://www.cnblogs.com/newvdgh/p/13276927.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。