java Redis执行Lua脚本与事务冲突
应用程序。yml:
spring:
redis:
host: 192.168.1.102
password: 123456
datasource:
druid:
username: root
password: 123456
url: jdbc:mysql://192.168.1.102:3306/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 6666
重新配置。爪哇:
@Configuration
//@EnableTransactionManagement
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
template.setKeySerializer(serializer);
template.setValueSerializer(serializer);
template.setHashKeySerializer(serializer);
template.setHashValueSerializer(serializer);
//template.setEnableTransactionSupport(true);
return template;
}
}
@SpringBootTest
class DemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
@Transactional
void test01() {
/**
* token=abcdef stored in redis
*/
Long result = (Long) redisTemplate.execute(new DefaultRedisScript("if redis.call('get',KEYS[1])== ARGV[1] then return redis.call('del',KEYS[1]) else " +
"return 0 end", Long.class), Collections.singletonList("token"), "abcdef");
System.out.println(result); // console will print 1,the token in redis will be deleted
}
}
Lua脚本可以在不使用事务的情况下正常执行
我在下面的测试中添加了事务管理,但出现了一些问题
@Configuration
@EnableTransactionManagement //Configuration enabling Transaction Management
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
template.setKeySerializer(serializer);
template.setValueSerializer(serializer);
template.setHashKeySerializer(serializer);
template.setHashValueSerializer(serializer);
template.setEnableTransactionSupport(true); //Configures RedisTemplate to participate in transactions by binding connections to the current thread.
return template;
}
}
@SpringBootTest
class DemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
@Transactional
void test01() {
/**
* token=abcdef stored in redis
*/
Long result = (Long) redisTemplate.execute(new DefaultRedisScript("if redis.call('get',KEYS[1])== ARGV[1] then return redis.call('del',KEYS[1]) else " +
"return 0 end", Long.class), Collections.singletonList("token"), "abcdef");
System.out.println(result); // console will print null,the token in redis will not be deleted
}
}
当我使用@EnableTransactionManagement
时,lua脚本无法正常执行
为什么lua脚本的执行结果返回null
如何在不影响lua脚本执行的情况下使用事务
共 (0) 个答案