如何使用@Transactional注释管理传播和隔离

时间:2014-02-28 09:26:11

标签: java spring transactions

我是春天的新手,我正在努力学习如何运作其交易背景。

我有一个从文件中读取并保留一些实体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);
        }

    }

}

}

@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
    }

}

我的问题是:

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

我还注意到,如果我将@Transactional注释放在readFromFile方法上,那么应用程序比没有注释的情况下运行需要更长的时间。

为什么呢?

1 个答案:

答案 0 :(得分:0)

为什么check1和readAll方法有事务处理?你应该在修改数据库时使用事务。

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