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语句无法优化,可能是由错误的业务逻辑导致。