1.@Transactional 注解应该只被应用到 public 方法上
2.spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务
3.Errors也会导致事务回滚
4.IOException是Checked Exception
5.spring的@Transactional事务生效的一个前提是进行方法调用前经过拦截器TransactionInterceptor,也就是说只有通过TransactionInterceptor拦截器的方法才会被加入到spring事务管理中,查看spring源码可以看到,在AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice方法中会从调用方法中获取@Transactional注解,如果有该注解,则启用事务,否则不启用。
这个方法是通过spring的AOP类CglibAopProxy的内部类DynamicAdvisedInterceptor调用的,而DynamicAdvisedInterceptor继承了MethodInterceptor,用于拦截方法调用,并从中获取调用链。如果是在同一个类中的方法调用,则不会被方法拦截器拦截到,因此事务不会起作用,必须将方法放入另一个类,并且该类通过spring注入。
(第5条来自转载)
例题:
method()方法如下,method()如果调用下面5个不同的update()方法,哪些SQL会被回滚 (多选):
@Service
public class TestService {
@Resource
TestService testService;
public void method() {
1. update1();
======================
2. testService.update2();
======================
3. testService.update3();
======================
4. testService.update4();
======================
5. testService.update5();
}
@Transactional
public void update1() {
//SQL_1
throw new Exception();
}
@Transactional
public void update2() {
//SQL_2
throw new Exception();
}
@Transactional
private void update3() {
//SQL_3
throw new Exception();
}
@Transactional
public void update4() {
//SQL_4
throw new Error();
}
@Transactional
public void update5() {
//SQL_5
throw new IOException();
}
}
A. SQL_1
B. SQL_5
C. SQL_2
D. SQL_3
E. SQL_4
答案:CE