天天看点

Spring事务回滚的两种方法

##方法一

1.使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类。

若配置在方法上,则该方法被加上了事务

若配置在类上,则等于给该类的所有方法都加上了该注解。此时如果在该类下的某个方法也加了 @Transaction ,则该方法使用自己的配置,其他方法使用类上的配置。

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        //some code
        //db operation
    }
}      
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    
    @Override
    public void save(User user) {
        userMapper.insert(user);
        throw new RuntimeException(); // 抛出异常,事务回滚,上面的insert插入失败。
    }
}      
@Service
public class UserServiceImpl implements UserService {
   @Autowired
   private DataSourceTransactionManager transactionManager;

   @Override
   @Transactional
   public void save(User user) {
       DefaultTransactionDefinition def = new DefaultTransactionDefinition();
       // explicitly setting the transaction name is something that can only be done programmatically
       def.setName("SomeTxName");
       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

       TransactionStatus status = transactionManager.getTransaction(def);
       try {
           // execute your business logic here
           //db operation
       } catch (Exception ex) {
           transactionManager.rollback(status);
           throw ex;
       }
   }
} // 此代码案例来自Alibaba Coding Guidelines