解决mysql死锁问题 SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction

钉钉机器人报警了

SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction

 在PHP调试时 提交事务触发异常后没有执行回滚导致mysql死锁,以致后续请求更新不了数据

问题原因

在mysql中事务a执行修改数据,比如: update table set a=1 where id=1;此时事务并未进行提交也没有回滚,然后事务B开始运行,修改同一条数据: update table set a=2 where id=1;

问题出现环境

1、在同一事务内先后对同一条数据进行插入和更新操作;
2、多台服务器操作同一数据库;
3、瞬时出现高并发现象;
4、语句中没有执行commit,也没有rollback就return退出了
比如参数检查不通过,直接return错误信息,导致回滚不能执行
如以下代码先执行了更新操作,后面出错又直接返回,导致没有执行rollback,对于这种操作return前一点要回滚,或者抛出异常统一扑捉后返回错误信息
$this->startTrans();
try {
   $user = new User();
   $user->where('id',$userId)->update(['realname'=>$parentName]);
   $existId = $this->where('class_id',$classId)->where('student_number',$number)->find();
   if ($existId) {
      return ['data' => '', 'code' => 300, 'msg' => '学号重复'];
   }
   $this->commit();
} catch (Throwable $e) {
   $this->rollback();
   return ['data' => '', 'code' => 20102, 'msg' => $e->getMessage()];
}

更多:https://blog.51cto.com/u_12390904/6254246

 

posted @ 2023-12-04 15:00  Tinywan  阅读(40)  评论(0编辑  收藏  举报