0

Spring事务注解的方法,如果抛RuntimeException,就会回滚
但是这个回滚指的是回滚数据库
如果这个方法里有对redis或者成员变量,集合元素等的赋值操作
如何回滚?
譬如

@Service
public class ServImpl{

    ArrayList<Product> productList; 

    @Transactional
    void doSomething(int id){
        daoImpl.deleteById(id);
        redisTemplate.decrBy("count", 1);
        productList.removeAt(id);
        。。。。
        //抛异常
        。。。   
    }
}

1个回答

2

https://www.ibm.com/developer...
可以参考一下这篇文章。

感觉你讲的数据库,redis之类的是由具体的PlatformTransactionManager决定的,比如数据库相关的事务管理是由DataSourceTransactionManager实现的。而spring也提供了jpa相关的数据库事务管理实现。所以如果redis配置的是支持事务,并且作为数据源加入了项目中,它会和别的事务一样一起回滚的。

PlatformTransactionManager还有以下多种实现。

clipboard.png

但是至于像数组操作的这样的操作,它是不会回滚的。因为首先事务的概念本身就是针对数据库的操作而产生的,而回滚则是为了确保一组数据库操作能够同时实现或是同时不实现。比如mysql就会根据log来执行回滚操作。但是数组并不属于事务定义的范围啊。当然啦,你也可以使用动态代理自己实现数组回滚这种啦。


撰写答案