1,开发环境,windows(这一点很重要)
2,用workerman运行一个定时器(别问我为什么用workerman只干这个,干的事儿很多,只是把这个抽离出来说),定时器里运行一些sql,相关的表有4个。
3,站点当然还有别的功能,不复杂,也是运行一些sql,相关的表也是4个。
3,在网站操作,点一会就会出现卡住,大概会卡个几十秒,然后workerman里会提示这句错误
General error: 1205 Lock wait timeout exceeded; try restarting transaction
4,反复测试(这个测试真的很坑,因为不是必现,想要复现错误,有时点十几分钟也不出现),确定了出现问题的sql,是一个update。update语句很简单,不会有什么错误,想了一会,猜测大概workerman里的update和网页操作的update出现了并发,并且是同一个表的同一条sql
5,为了验证猜测,在workerman里设置每秒运行一次这句update,然后网页上新增一个控制器,只有一句代码也是那个update,为了方便测试,加上事务和延迟,保证出现并发
#代码大概是这样
开启事务
update table set a=a-1 where id=1
sleep(2)
提交事务
6,修改下mysql的配置,把innodb_lock_wait_timeout改成5(默认应该是50),开始说的会卡住几十秒,记录了下发现就是50,所以应该是这个
7,测试,发现每次问题都会出现,只要是workerman里的sql和别的进行的sql,改同一条数据,就会出现mysql死锁。
8,然后就绝望了,因为已经是最简代码,总不能去看workerman代码去找问题。但是转念一想,用workerman的人那么多,不会只有我发现这个问题吧。所以上linux上试了下,果然是没问题(心中一万个斯巴达,这个bug困扰我2天,茶不思饭不想)
9,有钱了还是要用苹果做开发