当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务。比如MySQL的Innodb支持事务,而Mysaim不支持事务。方法一使用@Transaction配置自动回滚,可以配置在类上也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,类必须由spring控制。也就是说,已经注入的类,而不是新类。如果它配置在一个方法上,则该方法将添加一个事务。如果配置在一个类上,相当于给该类的所有方法都加上注解。这时,如果类下的某个方法也加了@Transaction,则该方法使用自己的配置,其他方法使用类上的配置。@Service@TransactionalpublicclassUserServiceImplimplementsUserService{@Overridepublicvoidsave(Useruser){//somecode//dboperation}}如果配置的方法或类抛出异常,事务会自动回滚。除非你在这个方法中手动捕获异常并且没有抛出新的异常。您可以使用@Transactional(rollbackFor=Exception.class)为特定异常设置事务回滚。如果不设置,RuntimeException和Error会默认回滚(参考源码中的文档)。@Service@Transactional(rollbackFor=Exception.class)publicclassUserServiceImplimplementsUserService{@ResourceprivateUserMapperuserMapper;@Overridepublicvoidsave(Useruser){userMapper.insert(user);抛出新的RuntimeException();//抛出异常,事务回滚,上述插入失败。}}复制代码方法2,注入DataSourceTransactionManager手动启动事务,手动回滚事务,用于抛出捕获异常后手动回滚,可控性更强,使用更灵活。首先注入DataSourceTransactionManager事务管理对象newaDefaultTransactionDefinitiondef=newDefaultTransactionDefinition();该对象使用TransactionStatusstatus=transactionManager.getTransaction(def);开始交易,使用transactionManager.rollback(status);回滚事务使用transactionManager.commit(status);提交这个交易//显式设置事务名称只能以编程方式完成def.setName("SomeTxName");def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatusstatus=transactionManager.getTransaction(def);try{//在这里执行你的业务逻辑//db操作}catch(Exceptionex){transactionManager.rollb确认(状态);扔前;}}}//此代码示例来自AlibabaCodingGuidelines
