Spring Data Redis - 对 Repository 的 @Transactional 支持

Posted

技术标签:

【中文标题】Spring Data Redis - 对 Repository 的 @Transactional 支持【英文标题】:Spring Data Redis - @Transactional support on Repository 【发布时间】:2017-05-06 22:54:32 【问题描述】:

我们将spring-boot-starter-parent 1.4.1 与spring-boot-starter-redisspring-boot-starter-data-redis 一起使用。我们使用 redis (a) 将消息传递给外部应用程序和 (b) 将一些信息存储在存储库中。我们的 redis 配置如下所示

@Configuration
@EnableRedisRepositories
open class RedisConfig 

    @Bean // for message passing
    @Profile("test")
    open fun testRedisChannelProvider(): RedisParserChannelProvider 
        return RedisParserChannelProvider("test_parser:parse.job", "test_parser:parse.joblist")
    

    @Bean // for message passing
    @Profile("!test")
    open fun productionRedisChannelProvider(): RedisParserChannelProvider 
        return RedisParserChannelProvider("parser:parse.job", "parser:parse.joblist")
    

    @Bean // for message passing
    open fun parseJobTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate<String, ParseJob> 
        val template = RedisTemplate<String, ParseJob>()
        template.connectionFactory = connectionFactory
        template.valueSerializer = Jackson2JsonRedisSerializer<ParseJob>(ParseJob::class.java)

        return template
    

    //@Bean // for message passing
    //open fun parseJobListTemplate ...

    // no template for repository

使用此配置,消息传递以及从存储库写入/读取都可以很好地工作。现在我正在尝试让@Transactional 与存储库进行通信,但到目前为止我还没有成功。我已经按照docs 中的示例配置并在其上手动启用了事务支持:

@Bean
open fun redisTemplate(): RedisTemplate<*, *> 

    val template = RedisTemplate<ByteArray, ByteArray>()
    template.setEnableTransactionSupport(true)
    return template

...但这显然不是要走的路。目前,写入存储库的所有内容(尤其是在测试期间)都保留在那里。

【问题讨论】:

【参考方案1】:

@Transactional 无法使用 Redis 存储库,我怀疑它是否会起作用。

背后的原因是 Spring Data Redis 存储库支持是如何工作的: RedisKeyValueAdapter 依赖于在持久化对象时发出的 write 和 read 操作的结果。

Redis 事务的行为更像是延迟批处理,因此不可能将 Redis 存储库支持包装在事务中,但需要采用不同的方法并施加一些限制。

【讨论】:

这是相当老的帖子,但你能给我们一些建议如何在单个事务中管理关系数据库和 redis 吗?在出现任何错误时都回滚

以上是关于Spring Data Redis - 对 Repository 的 @Transactional 支持的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data操作Redis详解

Spring Data Redis —— 快速入门

spring data redis

spring-data-redis 使用过程中踩过的坑

spring-boot-data-redis,使用redisson作为redis客户端

Spring data redis的使用