[英]issue with spring transaction management?
我正在使用Spring和Hibernate。 我正在使用Spring进行事务管理。 我有下课。
@Service
@Transactional(readOnly = true)
public class Sample implements SampleInterface{
@Override
public List<Some> getData(){
//gets data after that it updates something
setStatus(someId);
}
@Override
@Transactional
public void setStatus(Long someId){
//sets status
}
}
如果我不为getData()保留@Transactional,那么我将获得以下异常。
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode
如果我为getData()保留@Transactional,则它将正确保存。 这里有什么问题? 任何我有@Transactional为setStatus()。 我仍然需要为getData()保留@Transactional,因为它正在调用将设置状态的公共方法?
谢谢!
这个问题有点复杂,是由于在 getData()
内部调用setStatus()
引起的。 从外部调用getData()
时,实际上是在调用Spring框架为您创建的Java代理。 该代理应用事务行为(启动只读事务)并委托给您的实际服务类。 这很好。
但是,当您调用setStatus()
,您将绕过事务代理并直接调用服务。 换句话说于该请求setStatus()
不拦截, @Transactional
被忽略 。
没有简单的方法可以解决此问题,而ejb也存在相同的问题。 在同一类中调用公共方法时,您只需要格外小心。
当您调用getData(方法上没有@Transactional)时,Spring将启动一个只读事务,因为这是您的类的默认设置,当getData调用setStatus时,Spring将使用现有的仅rad事务,而不是创建一个新的事务。 这就是您得到例外的原因。
默认事务传播为“需要传播”。 在http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html#tx-propagation上阅读有关该主题的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.