首页 文章

Spring Data Redis - 对Repository的@Transactional支持

提问于
浏览
1

我们将 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 回答

  • 4

    @Transactional 使用Redis存储库是不可能的,我怀疑它会起作用 .

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

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

相关问题