问题描述
代码:voidfun(){Useruser=newUser();user.setId(1);user.setName("aaa");update(user);UsernewUser=select(1);//这里查询出的newUser的name还是更新前的值。}voidupdate(Useruser){//更新用户信息}Userselect(id){//根据id查询用户信息}
使用spring配置的事务的时候,上面方法fun、update被spring配置了事务propagation="REQUIRED"。数据库使用的mysql,Innodb引擎。数据库默认事务隔离级别是REPEATABLE-READ现在出现的问题是:在fun方法中先调用update()方法更新用户信息,然后再调用select()方法查询用户信息,结果查询出来的是旧值。问题出现的原因是方法fun()开启了一个事务T1,方法update()开启了一个事务T2。由于数据库隔离级别是REPEATABLE-READ,在T1事务开启之后,T2事务开启并提交,此时T1事务还是无法查看到T2事务提交的内容。如果将数据库事务隔离级别该为Read-Commit该问题就可以解决了,但是现在要求不能修改事务隔离级别。所以我想问,可不可以让update()方法不要单独开启一个事务,而是在fun()方法的事务中运行。那么fun()方法中应该就可以看到update()方法的更新了。
解决方案
解决方案二:
将update方法事务的传播属性设为REQUIRES_NEW
时间: 2024-09-12 07:55:24