背景
- 应产品需求,每日统计数据要重新刷一遍,于是用代码写了个接口,代码如下所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a5b7945662294564a0956caf159bfb51.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oSk5oCS55qE6Iu55p6cZXh0,size_20,color_FFFFFF,t_70,g_se,x_16)
- 谁知在执行这段代码时,刚好其他地方来了个修改的操作,我模拟了一下当时的场景,如下图所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1d74f6e838ed4ccf99c28af8d68946e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oSk5oCS55qE6Iu55p6cZXh0,size_20,color_FFFFFF,t_70,g_se,x_16)
- 因为我代码是加过事务的,此时还没执行完,没有提交事务,如果上面SQL和我的代码操作是同一条数据(因为有加索引,严格意义来说还不算表锁,所以操作同一条数据有问题),极有可能发生锁超时
Lock wait timeout exceeded; try restarting transaction
,如下图所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/68462933ba09413aa0dd68e65d8567e1.png)
反思
- 尽量避免长事务。我把事务去掉了,并记录好回滚方案。