【发布时间】:2021-01-20 04:16:16
【问题描述】:
在我们的应用程序中,我们同时使用 MySQL 服务器和 Redis 数据库。我们将 Redis 用作数据库,而不仅仅是缓存。我们在服务方法中同时使用它们,我想让方法 @Transactional 让 spring 管理我的事务。因此,如果在事务方法的中间抛出一个 RuntimeException,那么 Redis 和 MySQL 上的所有工作都会回滚。我遵循spring docs 并将我的@SpringBootApplication 类配置如下:
@SpringBootApplication
@EnableTransactionManagement
public class TransactionsApplication {
@Autowired
DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(TransactionsApplication.class, args);
}
@Bean
public StringRedisTemplate redisTemplate() {
StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory());
// explicitly enable transaction support
template.setEnableTransactionSupport(true);
return template;
}
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
}
@Bean
public PlatformTransactionManager transactionManager() throws SQLException, IOException {
return new DataSourceTransactionManager(dataSource);
}
}
这是我的服务方法:
@Service
@RequiredArgsConstructor
@Slf4j
public class FooService {
private final StringRedisTemplate redisTemplate;
private final FooRepository fooRepository;
@Transactional
public void bar() {
Foo foo = Foo.builder()
.id(1001)
.name("fooName")
.email("foo@mail.com")
.build();
fooRepository.save(foo);
ValueOperations<String, String> values = redisTemplate.opsForValue();
values.set("foo-mail", foo.getEmail());
}
但是在调用TestService的测试方法后,MySQL db中没有用户,我认为这是因为它没有活动的事务。这个问题有什么解决方案吗?我应该使用 spring ChainedTransactionManager 类,然后如何使用?还是只能通过MULTI手动管理Redis事务?
【问题讨论】:
标签: java mysql spring-boot redis spring-transactions