欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1205 - Lock wait timeout exceeded; try restarting transaction(解决备忘)

程序员文章站 2022-06-02 08:14:47
...

Lock wait timeout exceeded; try restarting transaction
原因:超过锁等待超时;请尝试重新启动事务

解决方法:更改数据库的事务隔离级别。

首先我这个是用INSERT INTO SELECT 方法批量处理了两个表,进行数据转移,大概有42万条数据(业务需求),然后数据库报错

1205 - Lock wait timeout exceeded; try restarting transaction
时间: 51.026s

在项目里面用的jdbcTemplate去进行数据库的操作。
然后项目是spring boot的项目,在方法上面加上了这个

@Transactional(isolation = Isolation.READ_COMMITTED)

在需要事务的类或者方法(service)上面添加@Transactional() 注解,里面可以配置需要的事务,如果没有设置默认的事务等级,需要在此添加isolation和propagation属性。

Isolation :隔离级别

DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);

SERIALIZABLE,可序列化
REPEATABLE_READ,可重复读取
READ_COMMITTED,读已提交
READ_UNCOMMITTED,读未提交
DEFAULT,默认
一般来说是默认的隔离级别,发生了这个问题,我给改成了读已提交。
什么是事务的隔离级别?---->哦,原来这就是“事务”,这就是“事务隔离级别”.


发现一个有意思的事情
我读源码的时候看见,这个隔离级别和传播行为都是实现的TransactionDefinition 这个接口,这个接口是干啥的呢?
TransactionDefinition接口控制着事务的属性
如何控制的呢?
1,getTimeout()方法,它返回一个事务必须完成的时间限制(以秒为单位)

default int getTimeout() {
		return TIMEOUT_DEFAULT;
	}

2,isReadOnly()方法,它表示事务是否只读。事务管理器的实现可以利用这个值来优化事务的执行,并确保事务只进行读取操作。

default boolean isReadOnly() {
		return false;
	}

3,getPropagationBehavior()方法·,返回传播值。

default int getPropagationBehavior() {
		return PROPAGATION_REQUIRED;
	}

4,getIsolationLevel()方法,返回隔离级别,可以看的默认的是这个隔离级别。

default int getIsolationLevel() {
		return ISOLATION_DEFAULT;
	}

今天有点累,后天周末,接着写完把,反正解决方法是给出来了,希望可以帮到你,刚刚使用,没有研究透彻,希望可以有人指点一下,谢谢


相关标签: java后端 java