Java 如何使用@Transactional annotation管理传播和隔离
我是spring的新手,我正在尝试学习如何处理它的事务上下文 我有一个服务,它从一个文件中读取并保存一些实体beanJava 如何使用@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 { //
@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
}