Mysql 事务中执行Update 会锁表吗?
背景介绍
多个定时任务同时对一张表执行修改,报出信息如下
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction;
Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting
日志提示表被锁,且第二个更新操作等待到超时了
即第一个任务开启事务执行批量修改,导致锁表,第二个任务执行批量update时等待到超时了;
问题定位
参考一些资料
开启事务会自动加锁这个我们都知道,
行级锁是基于索引实现的,where条件中不加索引时,不走索引会导致全表扫描,这样行级锁就无法实现了,这时候就是锁整张表。
所以如果没有索引,update会锁表,如果加了索引,就会锁行。