LAST_INSERT_ID使用造成订单串单问题

订单串单问题

代码

String sql ="insert into .....";
this.update(sql);
List<Long> list = this.queryBySql(Long.class, "select LAST_INSERT_ID("id") id from  order" 
Long id=list.get(0);

原因

  1. 执行插入语句是在写库,而SELECT LAST_INSERT_ID() 是在读库执行。
    • 打个比方说
      • 写库的id当前最大值是11,当执行插入的时候,因为id是主键自增长,写库的id最大值是12,假设这个时候写库还没有把数据同步到读库,这个时候执行select LAST_INSERT_ID,返回的是11。这就是串单的原因。

产生串单的条件

  1. 数据库读写分离
  2. 写库数据没有及时同步到读库,这个时候执行LAST_INSERT_ID函数

LAST_INSERT_ID详解(针对当前客户端连接)

自动返回最后一个INSERT插入数据的自增长主键的值。
##注意

  1. last_insert_id是针对当前客户端连接的,只会返回当前客户单插入数据的主键id。其他客户端插入生成的主键id对当前客户端无影响。
    • 打个比方说:
      • A客户端执行一个插入操作,生成的主键id是12,B客户端执行插入操作,生成的主键id是13,那么A客户端调用该函数返回的值还是12,而不是13。
  2. 假如你使用一条INSERT语句插入多个行, LAST_INSERT_ID() 只会返回插入的第一行数据时产生的值。
    1. 打个比方说:
      1. 我插入了2条数据,它们的生成的主键id分别是12,13,调用该函数只会返回12.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值