spring-projects/spring-data-redis

RedisTemplate.hasKey() Behavior Change with setEnableTransactionSupport = true

leeyohan93 opened this issue · 1 comments

When setEnableTransactionSupport is set to true in RedisTemplate,
the behavior of RedisTemplate.hasKey() may differ depending on the version of Spring Data Redis:

  • In version 2.7.X: hasKey() responds with a valid value.
  • In version 3.0.X ~ 3.2.X: hasKey() responds with null.

Based on the code debug, it appears that the introduction of RedisTemplate.doWithKeys() may have led to a change in the behavior of ConnectionSplittingInterceptor.intercept() In version 2.7, the invoke method at line 487 is called, while in version 3.0, the invoke method at line 477 is called.

In recent Spring Data Redis documentation, it is mentioned that "Read-only commands" are designed to work well in transactional contexts. However, it's unclear whether the exclusion of the hasKey command from this behavior is intentional or a bug.

I am using spring data redis well. Thank you

This is a regression we introduced with the new command interface design. In fact, trying to obtain a command interface first breaks ConnectionSplittingInterceptor as ConnectionSplittingInterceptor expects a Redis command invocation instead of the intermediate command interface to be returned.