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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 阿里巴巴编程规范