失效的场景
- 数据库引擎不支持事务
- 非spring管理的bean中设置@transactional
- 非public方法,如果非要用在非public方法上,可以开启AspectJ代理
- 方法自调用,没有经过spring的代理不生效
- 数据源没有配置事务管理器
- 被@transactional包裹的方法中的异常被吃掉
- 抛出的异常类型不是RuntimeException,默认情况下spring事务针对RuntimeExcption进行回滚,如果需要的话可以在@transactional中指定rollbackFor
@transactional 实现原理
ContextLoaderListener[spring] entends ServletContextListenertomcat ContextLoader[spring]
- @transactional
- TransactionInterceptor.java 对于注解的切面
- TransactionProxyFactoryBean.java 是一个factoryBean
- DefaultListableBeanFactory 类负责解析beanDefinetion并注入到spring
手动事务|声明方式事务
public class TransactionHelper{
@Resource
PlatformTransactionManager txManager;
public void run(Runnable action){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolation(TransactionDefinition.ISOLATION_READ_COMMITTED);
TransactionStatus status = txManager.getTransaction(def);
try{
action.run();
}catch(Exception ex){
txManager.rollback(status);
}
txManager.commit(status);
}
@Transactional(Isolation=xxx)
public void run1(Runnable action){
action.run();
}
}