Spring Data Redis - 对存储库的 @Transactional 支持

Chr*_*ius 1 transactional redis spring-data spring-data-redis spring-boot

我们将spring-boot-starter-parent1.4.1 与spring-boot-starter-redis和一起使用spring-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
Run Code Online (Sandbox Code Playgroud)

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

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

    val template = RedisTemplate<ByteArray, ByteArray>()
    template.setEnableTransactionSupport(true)
    return template
}
Run Code Online (Sandbox Code Playgroud)

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

mp9*_*1de 5

@Transactional使用 Redis 存储库是不可能的,而且我怀疑它根本不会起作用。

背后的原因是 Spring Data Redis 存储库支持的工作方式: RedisKeyValueAdapter依赖于写入和读取的结果于持久化对象时发出的

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

  • 这是相当老的帖子,但是您能给我们一些如何在单个事务中管理关系数据库和 Redis 的建议吗?如果出现任何错误则回滚 (2认同)