gpt4 book ai didi

spring-boot - Spring Data Redis - 存储库上的@Transactional 支持

转载 作者:IT王子 更新时间:2023-10-29 06:08:58 27 4
gpt4 key购买 nike

我们正在使用 spring-boot-starter-parent 1.4.1 以及 spring-boot-starter-redisspring-boot-starter-数据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
}

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

最佳答案

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

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

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

关于spring-boot - Spring Data Redis - 存储库上的@Transactional 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com