MySql 事务隔离级别(READ_COMMITTED/REPEATABLE_READ)遇到问题后,相关测试

1:线上问题描述:

        1.1:线上使用MySql 默认的隔离级别:REPEATABLE_READ,

        1.2:线上有相关流程:当相关机构授信流程N 分钟没有回调时,直接触发其他机构授信问询机构, 触发下一家流程使用两种方式进行:一种是采用延时队列进行,一种是使用类似补偿机制:task 轮训触发.

      1.3:线上出现单子:同时由 延时队列以及task触发,并且时间间隔很短,可以认为是并发进行

       task 执行时间点:

                  开始执行时间:     2020-12-02 12:08:00.005
                 结束执行时间点: 2020-12-02 12:08:00.385   

    延时队列处理相关时间点:

                  开始执行时间: 2020-12-02 12:08:00.372  

                  结束执行时间点:2020-12-02 12:08:00.755       

由于在方法调用入口处:使用   @Transactional  注解开始事务, 由于由时间的重叠,导致出现并发事务问题: 

                 task 执行时,插入新的请求机构数据,在未提交事务以前, 延时队列开启新的事务,导致延时队列查询相关机构是否已经发送机构数据未查询到, 出现再次发送给同一家机构的问题

2: 由于Mysql 使用的事务隔离级别是:REPEATABLE_READ, 一个事务再插入数据过程中,未提交事务以前,再开启其他事务读取数据时,读取不到新增的数据.

事务流程图):

事务流程

A事务

B事务

task执行开始,并开启事务

2020-12-02 12:08:00.005

 
task insert相关数据: 如:机构码为:AAA  
 

延时队列执行并开启事务

2020-12-02 12:08:00.372 

task 执行完成 并commit事务

2020-12-02 12:08:00.385   

 
 

查询是否有机构码为:AAA的相关数据?

1:查询结果为无(注:都查询的主库,不存在主从延迟的问题)

则进行相关数据的插入

 

执行完成并commit 事务

2020-12-02 12:08:00.755   

   

 

自测相关代码:

package com.s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值