Java 指定@Transactional rollbackFor是否也包括RuntimeException
该事务是否会回滚,或者我是否需要在注释中也包含RuntimeException.class?无需在Java 指定@Transactional rollbackFor是否也包括RuntimeException,java,spring,exception,transactions,rollback,Java,Spring,Exception,Transactions,Rollback,该事务是否会回滚,或者我是否需要在注释中也包含RuntimeException.class?无需在rollboor列表中包含RuntimeException。即使你不提它,它也会处理的。 我已经为jdbcTemplate试用过:- 输出: 插入后: 1迪帕克35000 2约格什35000 3阿迪蒂亚35000 更新异常 更新后 1迪帕克35000 2约格什35000 3阿迪蒂亚35000 但是,请注意,Spring框架的事务 默认情况下,基础结构代码将仅标记 在运行时回滚,未检查的异常;就是什
rollboor
列表中包含RuntimeException
。即使你不提它,它也会处理的。
我已经为jdbcTemplate试用过:-
输出:
插入后:
1迪帕克35000
2约格什35000
3阿迪蒂亚35000
更新异常
更新后
1迪帕克35000
2约格什35000
3阿迪蒂亚35000
但是,请注意,Spring框架的事务
默认情况下,基础结构代码将仅标记
在运行时回滚,未检查的异常;就是什么时候,
抛出的异常是RuntimeException的实例或子类。
(默认情况下,错误也会导致回滚。)选中
不会导致从事务方法引发的异常
在正在回滚的事务中
因此它也可以使用CheckedException(默认情况下为RuntimeException)回滚,例如: Output: After Insertion: 1 Deepak 35000 2 Yogesh 35000 3 Aditya 35000 update exception After Update 1 Deepak 35000 2 Yogesh 35000 3 Aditya 35000
@AlexBeardsley thnx指出了错误。。。我修改了答案。。我重新运行了代码。。是的,您不需要在rollbackFor列表中包含运行时异常。@AkshayKasar如果我不尝试,我就不会发布。根据我的经验,当您这样做时,人们开始复制您的代码而不了解它是如何工作的,然后,由于您不知道他们关于回滚/异常处理的真正意图,因此很难查看他们的代码。因此,我只希望在
rollboor
中列出选中的异常。在大多数情况下,这与抛出的声明中的内容相同,因此维护起来并不困难。同样,在大多数情况下,我会避免抛出异常,因为无法判断实际抛出了哪些已检查的异常。这仍然不能解释Rollbackor是加法还是替换RuntimeException/Error的默认行为。
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = MyException.class)
public void updateSalary(final int increment){
jdbcTemplate.update("update EMPLOYEE set emp_salary = emp_salary + ?", increment);
throw new RuntimeException("update exception");
}
Output:
After Insertion:
1 Deepak 35000
2 Yogesh 35000
3 Aditya 35000
update exception
After Update
1 Deepak 35000
2 Yogesh 35000
3 Aditya 35000
@Transactional(rollbackFor = Exception.class)
public void save(Book book) throws Exception {
bookRepository.save(book);
System.out.println("Saved in transcation.");
// No data is persisted
if (true) {
throw new Exception();
}
}