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

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


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

//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: 启用事务管理的配置

@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. 事务管理需要PlatformTransactionManagerSpring Data Redis未附带PlatformTransactionManager实现。假设你的应用程序使用JDBCSpring Data Redis可以通过使用现有的事务管理器来参与事务。

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

// 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");

最近更新

  1. TCP协议是安全的吗?

    2024-02-06 01:50:02       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-06 01:50:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-06 01:50:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-06 01:50:02       18 阅读

热门阅读

  1. 基础面试题篇2

    2024-02-06 01:50:02       27 阅读
  2. 设计模式概述

    2024-02-06 01:50:02       30 阅读
  3. window 挂载linux 网盘

    2024-02-06 01:50:02       34 阅读
  4. 医学CT成像的迭代算法 SART和OS-SART算法

    2024-02-06 01:50:02       33 阅读
  5. 循环神经网络(RNN)简介与应用

    2024-02-06 01:50:02       29 阅读
  6. 13、gitlab

    2024-02-06 01:50:02       34 阅读
  7. 数据结构之快速排序

    2024-02-06 01:50:02       31 阅读
  8. 网络安全简介

    2024-02-06 01:50:02       28 阅读
  9. 《微信小程序开发从入门到实战》学习九十九

    2024-02-06 01:50:02       34 阅读
  10. C# Avalonia 11.0.6 绘图

    2024-02-06 01:50:02       29 阅读
  11. SQL的函数类型

    2024-02-06 01:50:02       35 阅读
  12. 【工具】使用asciidoctor-pdf将adoc文件转换成pdf

    2024-02-06 01:50:02       31 阅读