Lock wait timeout exceeded; try restarting transaction

-- 查看进程,删除trx_state=LOCK的进程
select * from information_schema.innodb_trx;
 
kill trx_mysql_thread_id;
 
 
-- 删除耗时较长的线程
SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'root' ORDER BY TIME desc;
 
kill id;

 

引起Lock的原因:转载:https://www.cnblogs.com/myself1012/p/17668938.html

使用@Transactional注解过程中产生锁
原因:@Transactional是Spring框架提供的注解,用于注解类或方法,表示此类或方法需要在一个事务内执行。

1、一个事务中对同一张表进行了多次操作

2、在一个事务中对同一张表进行了读操作(select语句)和写操作(insert、update、delete语句)当出现这种情况时,可能会导致表被锁住,其他事务无法对它进行操作。如果需要并发地对表进行读写操作,这就会成为一个问题。

解决:

1、将读操作和写操作放在不同的事务中执行(方法拆分,使用多个@Transactional)

2、调整事务隔离级别(@Transactional(isolation = Isolation.READ_UNCOMMITTED))

3、插入、修改、删除操作进行异常捕获,然后手动设置事务回滚(不使用@Transactional注解)

 

posted @ 2023-12-21 11:40  正怒月神  阅读(19)  评论(0)    收藏  举报