webgame中Mysql Deadlock ERROR 1213 (40001)错误的排查历程(三)

2014-11-24 11:43:47 · 作者: · 浏览: 2
1)上锁了,开始等待他人提交事务…等待… 6 UPDATE `role_state` SET `state` = 1 WHERE `role_id` = ’53016′ 事物1打算给role_state表role_id为53016记录上 X 排它锁,发现被其他事务上了,而且此事务居然还在等他提交,这时MYSQL立刻回滚事务1…(php发现MYSQL返回死锁信息,随记录该信息到异常日志…发送回滚指令…mysql已经“帮”他回滚了…) 7 【执行成功…】 事务2发现别人释放锁了,OK,获取X锁,修改成功 8 commit PHP程序发现上一条指令执行完毕,且执行无错,即,发送commit指令,提交事务。

好像有个参数%^&#:
innodb_lock_wait_timeout参数是干啥的呢?从mysql官方手册上看,此参数是针对锁等待时,一个限定等待时间的参数。跟死锁并无关系,一旦mysql发现死锁,立刻回滚导致死锁的语句。并不会用到该参数。

规避方式:

  • 缩小事务的语句数量
  • 调整SQL语句执行顺序,变“死锁”为“锁等待”,等待一会,总比整个事务回滚掉,全部重新再执行这个流程要强.
  • 其他.请补充

关于锁等待:
缩小事务间SQL语句的数量,减小规模吧。当然,提高检索速度,提高查询时间也是首要因素,我们就发现我们的SQL语句中,有几个没有用到索引,导致锁表,导致锁等待发生…

备注:
年底了,冲KPI的,各位见笑了