Java 在Spring中使用事务管理的代码有什么错误
缺少什么以便我的事务可以工作 所以我刚刚发现带有Transaction的方法必须在自己的类中,并且该方法也应该是公共的。但不知何故,它在我的情况下仍然不起作用。我真的开始生气了Java 在Spring中使用事务管理的代码有什么错误,java,spring,jpa,Java,Spring,Jpa,缺少什么以便我的事务可以工作 所以我刚刚发现带有Transaction的方法必须在自己的类中,并且该方法也应该是公共的。但不知何故,它在我的情况下仍然不起作用。我真的开始生气了 @Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class) void saveUserAndHol
@Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class)
void saveUserAndHoliday(User user, Holiday holiday)
{
// At this point vacationDays of user is 27
userDao.save(user);
// here vacationDays of user is 24
holiday.setOvertime(null);
holidayDao.save(holiday);
//here exception is thrown so I would expect vacationsDays be rolled back to 27
}
有几个可能的原因导致它不能按预期工作
holidayDao.save(holiday)
使用@Transactional(propagation=REQUIRES\u new)
启动另一个新事务,因此在引发异常时已提交假日更改saveUserAndHoliday()
,以这种方式调用时,@Transaction
将不会生效。此外,它仅适用于具有公共可见性的方法。(详情请参见本节)你好,艾丽西亚。你能不能多花点时间写一篇文章,具体一点?谁是您代码(控制器、服务)的客户?您正在构建什么样的应用程序?只是春天吗?也许是弹簧靴?你是怎么做到的?另外,您使用的是哪种数据库?MySQL,Postgrel?H2?谢谢。如果您在方法所在的服务中使用方法@Transaction不工作,我只使用Spring。它在控制器中,一个私有方法这个方法是一个私有方法,或者包是可见的。它只在这个控制器类中使用。只是为了使它具有交易性,我应该将其公开。听起来很奇怪你说第一是什么意思?是的。您应该公开事务性方法,并且必须从另一个Springbean调用它,这就是AOP(基于封面下的@transactional的技术)在(1)中的工作方式,我的意思是holidayDao.save()也用@transactional注释,但根据需要配置它,这意味着,如果此方法成功完成,则另一个单独的新事务将在该方法执行和提交之前启动。如上所示,只有saveUserAndHoliday用Transactional注释。在这个方法中,会发生2个DAO调用。首先是userDAO.save,然后是holidayDAO.save。
@Service
public class MyService {
UserDao userDao;
HolidayDao holidayDao;
public MyService(UserDao userDao, HolidayDao holidayDao)
{
this.userDao = userDao;
this.holidayDao = holidayDao;
}
@Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED,readOnly=false,timeout=1000, rollbackFor=Exception.class)
public void saveUserAndHoliday(User user, Holiday holiday)
{
userDao.save(user);
holiday.setOvertime(null);
holidayDao.save(holiday);
}
}