如何解决如何在新交易中保存实体?
我有一个方法,该方法调用另一个方法来保存具有新事务的实体对象。
android:layout_weight="0.1"
process()正在FooCreator类中调用createFoo()方法,以使用@Transactional(propagation = Propagation.REQUIRES_NEW)创建foo对象。
public class FooProcessor {
@Transactional
public Foo process(final String id,final String name,final String description) {
final Foo foo = this.fooCreator.createFoo(id,name,description);
foo.setDescription("Change description");
this.fooDAO.save(foo);
return foo;
}
}
在处理方法中修改返回的foo对象时,它将另存为新对象。如何修改createFoo()返回的现有foo对象?
如果我尝试使用findById,它仍然会引发异常。
public class FooCreator {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Foo createFoo(final String id,final String description) {
return this.fooDAO.save(new Foo(id,description));
}
}
解决方法
如果未使用适当的隔离级别,则您的方法应该无法读取新事务中的更改。如果将隔离级别设置为READ_COMMITED
,则处理方法可以读取创建者方法的更改。
@Transaction(isolation = Isolation.READ_COMMITTED)
public Foo process(final String id,final String name,final String description) {
}
如果您具有更高的隔离级别,则该事务可能无法读取通过REQUIRED_NEW事务在方法中所做的更改。举个例子,如果您设置了限制性更强的Isolation.SERIALIZABLE,您的代码将给出一个NotFoundException
,因为无法在process方法的事务内部读取在creator方法中所做的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。