spring @transactional失效的场景

79 阅读1分钟
失效的场景
  • 数据库引擎不支持事务
  • 非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();
    }
}