繁体   English   中英

春季交易管理问题?

[英]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 被忽略

没有简单的方法可以解决此问题,而也存在相同的问题。 在同一类中调用公共方法时,您只需要格外小心。

也可以看看

当您调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM