开卷故意,好久没写博客了,近期工作也挺忙的。
死锁距离我不遥远。最终还是在高并发时被我碰到了。
DeadLock Found!
虽然编程风格中会尽量避免死锁,可是还是被我碰上了。文章可能看不出来我在做什么事情。仅仅是记录自己的一个排除死锁的过程。
事情起源于两个联动的缓存+redis+异步数据库读写操作。
事务中的这句出现死锁:
DELETE FROM table WHERE FROM key = ‘helloworld’
当初的思考解除死锁的思路例如以下:
1)分析死锁模型,如果1,2 两个线程,如果A,B两个锁,通俗的说 :
1持有A锁。等待B锁 -- 2 持有B锁。等待A锁
于是掐这了,就瘫了。
2)继续思考,要真这么简单,也不好意思称自己project师了,实际开发中都是碰到死锁环。
什么意思呢?继续如果
1持有A。等B,
2持有B,等C,
3持有C。等A
Anyway,读者能够自己如果还有4。5,6。7...
3)继续思考,死锁出现,第一步肯定是重审自己的代码。这个时候一定要对使用的成熟的工具优先保持自信但要保留质疑的态度。怎么重审,记录我的过程
a,我们说代码越简洁,越不easy出错。所以,秉着DRY原则。也要消除反复的代码,能复用就绝对不看着行数而自得。
b。重构过后。一定是要数据层,逻辑层分离。不要在数据层包括逻辑处理。不要在逻辑层去做数