Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用@Transactional annotation管理传播和隔离_Java_Spring_Transactions - Fatal编程技术网

Java 如何使用@Transactional annotation管理传播和隔离

Java 如何使用@Transactional annotation管理传播和隔离,java,spring,transactions,Java,Spring,Transactions,我是spring的新手,我正在尝试学习如何处理它的事务上下文 我有一个服务,它从一个文件中读取并保存一些实体bean @Service public class MyServiceImpl{ @Autowired MyObjectService myObjectService; @Transactional(propagation = Propagation.REQUIRES_NEW) public void readFromFile() throws Exception { //

我是spring的新手,我正在尝试学习如何处理它的事务上下文

我有一个服务,它从一个文件中读取并保存一些实体bean

@Service
public class MyServiceImpl{

@Autowired
MyObjectService myObjectService;


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void readFromFile() throws Exception {
    //Do something
    checkAndSave();     
}   


public void checkAndSave() throws Exception {

    List<MyObject> objects = myObjectService.readAll();

    for(MyObject myObject : objects){

        boolean check1 = myObjectService.check1();

        if(check1){
            myObjectService.save(myObject);
        }

    }

}
@服务
公共类MyServiceImpl{
@自动连线
MyObjectService MyObjectService;
@事务性(传播=传播。需要\u新建)
public void readFromFile()引发异常{
//做点什么
checkAndSave();
}   
public void checkAndSave()引发异常{
List objects=myObjectService.readAll();
用于(MyObject MyObject:objects){
布尔check1=myObjectService.check1();
如果(检查1){
myObjectService.save(myObject);
}
}
}
}

@服务
公共类MyObjectServiceImpl实现MyObjectService{
@存储库
MyObjectRepository MyObjectRepository
@事务(只读=真)
公共列表readAll(){
myObjectRepository.findAll()
}
@事务(只读=真)
公共布尔校验1(){
//运行一些选择来检查一些东西
}
}

我的问题是:

checkAndSave方法将在事务中运行? checkAndSave方法将在readFromFile方法的同一事务中运行

我还注意到,如果我将@Transactional注释放在readFromFile方法上,那么应用程序运行所需的时间比不使用注释要长得多


为什么?

为什么在check1和readAll方法上有事务性?修改数据库时应使用事务

Save方法将在其自己的事务中运行,而不是在与read方法相同的事务中运行。
事务中的时间要长得多,因为它在执行之前会验证所有内容。

为底层数据存储提供在其认为合适时应用这些优化的机会。但是,如果一起使用readOnly,我还应该使用传播属性吗?
@Service
public class MyObjectServiceImpl implements MyObjectService{

    @Repository
    MyObjectRepository myObjectRepository


    @Transactional(readOnly=true)
    public List<MyObject> readAll(){ 
        myObjectRepository.findAll()
    }

    @Transactional(readOnly=true)
    public boolean check1(){

        //run a few select to check somethings
    }