闽公网安备 35020302035485号
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setEnableTransactionSupport(true);
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
例1,使用@Transactional注解,方法执行过程中报错,代码如下: @Transactional
public void testRedisTransaction() {
employeeMapper.updateByPrimaryKey(Employee.builder()
.id(4L)
.name("uuuuu")
.gender(Gender.MALE)
.build());
redisTemplate.opsForValue().set("111", "111");
int i = 1 / 0;
redisTemplate.opsForValue().set("222", "111");
}
执行前Redis缓存情况:
java.lang.ArithmeticException: / by zero猜猜执行完后数据库和Redis中数据操作是什么样的?

@Transactional
public void testRedisTransaction() {
employeeMapper.updateByPrimaryKey(Employee.builder()
.id(4L)
.name("uuuuu")
.gender(Gender.MALE)
.build());
System.out.println(1234);
redisTemplate.opsForValue().set("111", "a");
redisTemplate.opsForValue().set("222", "a");
redisTemplate.exec();
int i = 1 / 0;
}
这次主动在报异常前提交了Redis事务,结果如下:
@Transactional
public void testRedisTransactionOnly() {
redisTemplate.opsForValue().set("333", "a");
redisTemplate.opsForHash().put("333", "a", 111);
}
正常来说,应该会报WRONGTYPE Operation的错误,不过,执行结果是这样的:
// @Transactional
public void testRedisTransactionOnly() {
redisTemplate.opsForValue().set("333", "a");
redisTemplate.opsForHash().put("333", "a", 111);
}
执行结果:
最后,来自Redis官网的一句话佐证我们的结论, 附出处:Transactions | Redis