有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

spring事务管理的java问题?

我正在使用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 for setStatus()的任何方法。当@Transactional for getData()调用将设置状态的公共方法时,我还需要保留它吗

谢谢


共 (2) 个答案

  1. # 1 楼答案

    这个问题有点复杂,是由在getData()内调用setStatus()引起的。当您从外部调用getData()时,实际上是在调用Spring框架为您创建的Java代理。此代理应用事务行为(启动只读事务)并委托给您的实际服务类。这个很好用

    但是,当您调用setStatus()时,您将绕过事务代理,直接调用您的服务。换句话说,对setStatus()的请求不会被拦截,并且@Transactional被忽略

    处理这个问题没有简单的方法,而且也有同样的问题。在同一个类中调用公共方法时,只需格外小心

    另见