我是春天的新手,我正在努力学习如何运作其交易背景。
我有一个从文件中读取并保留一些实体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方法上,那么应用程序比没有注释的情况下运行需要更长的时间。
为什么呢?
答案 0 :(得分:0)
为什么check1和readAll方法有事务处理?你应该在修改数据库时使用事务。
Save方法将在其自己的事务中运行,而不是与read方法相同。 它在事务中需要更长的时间,因为它会在执行之前验证所有内容。