1

Мы используем spring-boot-starter-parent 1.4.1 вместе с spring-boot-starter-redis и spring-boot-starter-data-redis. Мы используем redis для (a) сообщения, передающего внешнее приложение, и (b) для хранения некоторой информации в репозитории. Наш REDIS конфигурация выглядит следующим образомSpring Data Redis - поддержка @Transactional на репозитории

@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 
} 

... но это, по-видимому, не путь. В настоящее время все, записанное в репозиторий (в частности, во время тестов), остается там.

ответ

2

@Transactional Использование редизайтов Redis невозможно, и я сомневаюсь, что он будет работать вообще.

Причина в том, как Spring Data Redis поддержка хранилища работ: RedisKeyValueAdapter опирается на результаты write и read операций, которые выдаются в то время как сохраняющиеся объект.

Операции Redis ведут себя скорее как отложенные партии, поэтому невозможно обернуть поддержку репозитория Redis внутри транзакции, но для этого требуется другой подход и наложить несколько ограничений.