redis 事务处理,一旦异常,则回滚

事务操作: RedisTemplate支持事务操作,您可以使用multi()exec()discard()来开启、提交或取消事务。

于是使用 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * redis事务测试
 * @author 陈惟鲜
 * @date 2023年6月10日 下午2:07:03
 * @throws Exception
 */
@Test
public void redis_transaction_test2() throws Exception {
    String pattern = "test:";
    try {
        // 事务开启
        redisTemplate.multi();
        redisTemplate.opsForValue().set(pattern + "aa", "aa123456");
        redisTemplate.opsForValue().set(pattern + "bb", "bb123456");
        // 异常
        System.out.println(5 / 0);
        // 事务提交
        redisTemplate.exec();
    } catch (Exception e) {
        // 事务回滚
        redisTemplate.discard();
        e.printStackTrace();
    }
}

  这样执行会异常,但是事务并未回滚,

提交事务,提示

org.springframework.dao.InvalidDataAccessApiUsageException: No ongoing transaction; Did you forget to call multi
    at org.springframework.data.redis.connection.jedis.JedisConnection.exec(JedisConnection.java:466)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:61)
    at jdk.proxy2/jdk.proxy2.$Proxy695.exec(Unknown Source)

 

 

 

修改为下面方式出现异常,能正常回滚

复制代码
/**
     * redis事务测试
     * @author 陈惟鲜
     * @date 2023年6月10日 下午2:07:03
     * @throws Exception
     */
    @Test
    public void redis_transaction_test() throws Exception {
        String pattern ="test:";
        try {
             // 使用sessionCallBack处理
            SessionCallback<Boolean> sessionCallback = new SessionCallback<Boolean>() {
                List<Object> exec = null;
                @Override
                @SuppressWarnings("unchecked")
                public Boolean execute(RedisOperations operations) throws DataAccessException {
                    operations.multi();
                    redisTemplate.opsForValue().set(pattern+"cc", "aa123456");
                    redisTemplate.opsForValue().set(pattern+"dd", "bb123456");
                    exec = operations.exec();
                    if(exec.size() > 0) {
                        return (Boolean) exec.get(0);
                    }
                    return false;
                }
            };
            System.out.println(5/0);
            redisTemplate.execute(sessionCallback);
        }catch(Exception e) {
            e.printStackTrace();
            // 事务回滚
            redisTemplate.discard();
        }
    }
复制代码

 

posted on   陈惟鲜的博客  阅读(155)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-09-11 接口测试自动化
2019-09-11 接口定义模板
2019-09-11 java对象转换
2019-09-11 分布式任务调用
2019-09-11 公共组系统能力
2019-09-11 spring-boot-admin 监控
2019-09-11 阿里巴巴编程规范

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示