在 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”未能如願插入,事務生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章