@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