【Spring连载】使用Spring Data访问Redis(十一)----Redis事务 Transactions

【Spring连载】使用Spring Data访问Redis(十一)----Redis事务 Transactions

  • [@Transactional 支持](#@Transactional 支持)

Redis通过multi, exec 和 discard命令为事务提供支持。RedisTemplate上提供了这些操作。但是,RedisTemplate不能保证使用相同的连接运行事务中的所有操作。
Spring Data Redis提供了SessionCallback接口,以便在需要使用同一连接执行多个操作时使用,例如在使用Redis事务时。以下示例使用multi方法:

java 复制代码
//execute a transaction
List<Object> txResults = redisOperations.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    operations.multi();
    operations.opsForSet().add("key", "value1");

    // This will contain the results of all operations in the transaction
    return operations.exec();
  }
});
System.out.println("Number of items added to set: " + txResults.get(0));

RedisTemplate使用它的value、hash key和hash value序列化器在返回之前对exec的所有结果进行反序列化。还有一个额外的exec方法,它允许你为事务结果传递自定义序列化器。

@Transactional 支持

默认情况下,RedisTemplate不参与Spring事务。如果你希望RedisTemplate在使用@Transactional或TransactionTemplate时使用Redis事务,则需要通过设置setEnableTransactionSupport(true)来显式启用对每个RedisTemplate的事务支持。启用事务支持将RedisConnection绑定到ThreadLocal支持的当前事务。如果事务完成时没有出现错误,Redis事务将使用EXEC提交,否则将使用DISCARD回滚。Redis事务是面向批(batch-oriented)的。在正在进行的事务期间发出的命令将排队,并且仅在提交事务时应用。

Spring Data Redis区分正在进行的事务中的只读命令和写入命令。只读命令,如KEYS,通过管道传输到新的(非线程绑定的)RedisConnection以允许读取。写入命令由RedisTemplate排队,并在提交时应用。

以下示例显示了如何配置事务管理:
例1: 启用事务管理的配置

java 复制代码
@Configuration
@EnableTransactionManagement   --------1                      
public class RedisTxContextConfiguration {

  @Bean
  public StringRedisTemplate redisTemplate() {
    StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory());
    // explicitly enable transaction support
    template.setEnableTransactionSupport(true);   --------2           
    return template;
  }

  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    // jedis || Lettuce
  }

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

  @Bean
  public DataSource dataSource() throws SQLException {
    // ...
  }
}
1. 配置Spring上下文以启用声明性事务管理。
2. 将RedisTemplate配置为通过将连接绑定到当前线程来参与事务。
3. 事务管理需要PlatformTransactionManager。Spring Data Redis未附带PlatformTransactionManager实现。假设你的应用程序使用JDBC,Spring Data Redis可以通过使用现有的事务管理器来参与事务。

下面的例子分别演示了一个用法约束:
例2: 使用约束

java 复制代码
// must be performed on thread-bound connection
template.opsForValue().set("thing1", "thing2");

// read operation must be run on a free (not transaction-aware) connection
template.keys("*");

// returns null as values set within a transaction are not visible
template.opsForValue().get("thing1");
相关推荐
微露清风12 分钟前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥16 分钟前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
夜泉_ly16 分钟前
Redis -持久化
数据库·redis·缓存
2351620 分钟前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
聪明的笨猪猪24 分钟前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.41 分钟前
怎么办这是Apifox里执行http://localhost:9002/goods/getByUserName?name=“张三“为什么我改了还是500?
java·网络·网络协议·http
编程饭碗42 分钟前
【Java集合】
java
岁岁岁平安43 分钟前
Java的双重检查锁机制(DCL)与懒加载的单例模式
java·单例模式·synchronized·
Jabes.yang1 小时前
Java面试场景:从Spring Boot到Kubernetes的技术问答
java· 面试· spring boot· 微服务· kubernetes· 技术栈· redis
用户31187945592181 小时前
redis-4.0.11-1.ky10.sw_64.rpm安装教程(申威麒麟V10 64位系统详细步骤)
redis