mysql 主从切换引起不能写入报错

1.背景

        保险渠道对接系统,业务对账的时候发现,保司有保单渠道没有保单;渠道每个http投保请求都会把请求参数和处理结果存在请求单表(request_order)里边,根据渠道单号做幂等。

2.问题定位

       2.1  根据对账的渠道单号,查request_order 表,发现并没有成功请求记录。然后查看业务请求代码 ,具体伪代码如下:

String result = "";
try {
     1. 各种业务处理 ,比如:业务校验,保单投保
      result = handleBiz();

    2. 新增 request_order 记录  
    insertRequestOrder(record); //没有用 try catch 包装,数据库操作异常会直接构建错误返回
   
} catch (Exception e) {
     log.error("lotus adapter error:"+e.getMessage(),e);
     //构建错误的返回结果
     result = buildFailResponseDTO(e);
}

return result;

          由于渠道有系统错误失败重试机制,保险前置系统也有业务校验逻辑,比如:一个被保人只       能投一个保单,所以重试会失败。

         从代码逻辑来看,基本可以推测 请求单 落库失败了,具体失败原因查看日志定位,报错如下:

            2021-02-20 02:00:09,197 [http-nio-8080-exec-60] ERROR [com.service.impl.RequestOrderServiceImpl] [RequestOrderServiceImpl.java:40] [trace=,span=,parent=] - 数据库操作异常:
org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
### The error may involve com.zhongan.dji.mapper.RequestOrderMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO dji_request_order  ( id,channel_order_no,service_name,version,request,response,request_time,rt_status,rt_op_time,asyn_status,asyn_op_time,extra_info,is_deleted,gmt_created,creator,gmt_modified,modifier ) VALUES( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )
### Cause: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
; uncategorized SQLException; SQL state [HY000]; error code [1290]; The MySQL server is running with the --read-only option so it cannot execute this statement; nested exception is java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy118.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)

      日志显示只存在短暂的时间报这种mysql错误;关键一段报错:The MySQL server is running with the --read-only option so it cannot execute this statement;看到这个报错心中有一万个疑惑,msyql 数据库 read-only; 怎么会存在只能读这个问题。马上联想到DBA 干了啥好事吧:

        数据库架构是:分库分表和主从架构,最后定位的结果为:mysql 做了主从切换,从库切为主库过程 只读 属性的配置修改有些延迟,造成无法写入数据。

3.启发

      3.1 对业务结果不造成影响的操作,不能影响接口的返回结果;比如:request_order 插入记录失败。

      3.2 对存在幂等的操作的业务,做实际的业务操作前,必须先插入 请求记录单,然后处理业务请求,根据业务处理的结果,再进行更新请求记录单。

查询文章:https://blog.csdn.net/lwei_998/article/details/50445830

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值