在 SpringBoot 2.x 中使用 @Transactional 对 Redis 事务管理

一.添加 Redis 基础配置

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

二.开启 Redis 事务配置

@Configuration
@EnableTransactionManagement // 1
public class RedisConfig {
    @Bean
    public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        // 配置redisTemplate
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        // 打开事务支持
        stringRedisTemplate.setEnableTransactionSupport(true); // 2
        return stringRedisTemplate;
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException {
        return new DataSourceTransactionManager(dataSource()); // 3
    }

    @Bean
    public DataSource dataSource() throws SQLException {
        // ...
    }
}
  1. 开启 SpringBoot 事务管理。
  2. 通过绑定 Connection 的方式开启 Redis 事务支持。
  3. 事务管理需要 PlatformTransactionManager。而 Spring Data Redis 自身没有 PlatformTransactionManager 的实现。所以需要指定一个已有的 PlatformTransactionManager 供 Spring Data Redis 使用。如果你已经配置了 JDBC ,则这步可以省略。
    参考官方文档:https://docs.spring.io/spring-data/redis/docs/2.1.5.RELEASE/reference/html/#tx

三.Redis 工具类实现

@Repository
public class RedisDAOImpl implements RedisDAO {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void set(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    @Override
    public String get(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    @Override
    public boolean del(String key) {
        return stringRedisTemplate.delete(key);
    }
}

四、使用方式及测试类

在需要进行事务的方法上,添加 @Transactional 注解即可。可同时对方法中多个数据源操作实现共同事务。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = XXX.class)
public class RedisTest {
    @Autowired
    private RedisDAO redisDAO;

    @Test
    @Transactional(rollbackFor = Exception.class)
    public void sendAttachmentsMail() {
        redisDAO.set("test1", "22");
        int i  = 1 / 0;  // 异常代码
        redisDAO.set("test2", "11");
    }
}

五、结果

127.0.0.1:6379> keys *
(empty list or set)

可见,因为“四”中的异常代码,“test1”未能如愿插入,事务生效。

你可能感兴趣的:(SpringBoot,Redis)