错误日志

理论(重要)

所谓的死锁,一定是两个线程互相等待对方的资源。对于MySQL 来说,那就是两个事物锁住了对方的数据。
MySQL的innodb有 表锁、行锁,如果锁表那死锁的概率很大,一般我们操作都是带有参数的 where id = 'xxx'
理论上如果写delete or update 的时候带了上面的条件,按照我们的理解那就是行锁, 并发情况下只要我们参数不一致那永远不会造成死锁
但实际情况总不会如人意的,我造成死锁的2个SQL就是上面这样的操作,两个删除都是带了 where,但还是锁表了

行级锁在使用的时候并不是直接锁掉这行记录,而是锁索引
如果一条sql用到了主键索引(mysql主键自带索引),mysql会锁住主键索引;
如果一条sql操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引.

一般造成死锁的原因是因为两个事物添加锁的时候没能及时的解锁释放资源,等到第二个事务要添加锁的时候发现已经被锁,从而造成环路等待,构成死锁条件。

阿里云sql日志

UPDATE crm_user_course_info  SET course_catalog_red_dot_status=0  
 
 WHERE  product_id='64216f9de4b07f6b92d2011a'
 AND product_spec_id='64216f9de4b07f6b92d2011b'
 AND user_id='5e11e0fb4368380cad59a1f3'

阿里云实例诊断报告详情

创建阿里云实例诊断报告

参考

https://blog.csdn.net/Tomwildboar/article/details/125299471

posted on 2023-05-18 20:06  哑吧  阅读(551)  评论(0编辑  收藏  举报