update事务死锁

转载请注明出处WangYuheng’s Blog

现象

java程序报错

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

原因

业务中update语句需要通过子查询where条件,子查询的select中需要调用外部表的参数作为条件。
随着数据量的增加,sql语句执行过慢,请求过于频繁,导致死锁。

解决方法

  • 不建议增加线程锁,可通过适当的增加索引,优化sql语句执行速度。
  • 尽量避免子查询,exists替代in
  • 亦可先执行select查询,保存在结果集中,再进行批量update操作。
  • 将两个操作增加事务标签。
  • 如果sql语句无法优化,可能是由错误的业务逻辑导致。