首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redis事务和jdbc事务

redis事务和jdbc事务
EN

Stack Overflow用户
提问于 2020-10-05 17:48:25
回答 1查看 457关注 0票数 0

在我们的应用程序中,我们同时使用MySQL服务器和Redis数据库。我们使用Redis作为数据库,而不仅仅是缓存。我们在一个服务方法中使用了这两个方法,我想让这个方法@ transactions来让spring来管理我的事务。因此,如果在事务性方法中间抛出RuntimeException,那么Redis和MySQL上的所有工作都会回滚。我遵循spring docs并配置了@SpringBootApplication类,如下所示:

代码语言:javascript
复制
@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);
    }
}

这是我的服务方法:

代码语言:javascript
复制
@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数据库中没有用户,我认为这是因为it.Is没有活动的事务,有什么解决方案吗?我是否应该使用spring ChainedTransactionManager类,然后如何使用?或者我只能通过MULTI手动管理Redis事务

EN

回答 1

Stack Overflow用户

发布于 2020-10-18 15:23:22

在尝试了FooService类之后,我发现在一个服务方法中使用@Transactional,这个方法旨在与Redis一起工作,并专门从Redis读取一个值(我认为大多数服务方法都应该从DB读取一些值),因为任何读取操作都会导致空值,这是因为Redis会对事务的所有操作进行排队,并在结束时执行它们。综上所述,我认为使用MULTIEXEC操作更可取,因为它提供了更多的控制来使用Redis中的数据。毕竟,任何使用Redis事务的建议都是值得感谢的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64206229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档