Mysql主从库读写与事务

10 篇文章 0 订阅
2 篇文章 0 订阅

通常任务系统会选择生产者-消费者模型,中间有一个队列用于记录任务,例如使用 redis 的队列结构。同时任务扭转和执行状态信息落盘保存,例如 Mysql 的一张表。此时会有有两个模块同时读写 Mysql 的同一条数据。

通常说来 Mysql 的配置是一主两从,分别在3台机器上。写操作和事务操作落在主库,读操作大都落在从库。以上面的模型为例子:
1、生产者产生了一个任务,加入 redis 中,同时在 Mysql 中写入一条任务初始化数据;
2、消费者从 redis 中取出一条数据,紧接着从 Mysql 中取出对应对应任务记录,更新相关信息;

如果生产者的生产和消费者的消费之间间隔很小,那么很有可能会因为主从同步延迟的问题,导致消费者在 Mysql 中取不到任务记录。

一般来说,解决办法是消费者的这次读操作加上事务,那么会落到主库。此时一定会读取到任务记录,保证业务上的一致性。

我在使用 java spring 系做这些的时候,还遇到一个点。为了提高性能,我不会对整个业务方法加上 @Transaction 事务注解,这样可能会导致事务太大。我一般把相关 sql 语句抽取出来,就地单独成一个方法,然后在这个方法上加上 @Transaction 事务注解。

然而这样做不对。不是说想法不对,而是忽略了 spring 的机制。如果就地成一个方法,那么这个方法会在当前类的某个方法中调用。此时,会因为 AOP 的机制导致事务压根儿没生效。AOP 的机制是对接口代理。而方法内在调用,已经不会经过这一层封装,所以此时的事务注解没起作用。比较简单的解决方式是新建一个类,作为这类 sql 的组合封装。然后在这些类方法上加上事务注解。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值