订单串单问题
代码
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);
原因
- 执行插入语句是在写库,而SELECT LAST_INSERT_ID() 是在读库执行。
- 打个比方说
- 写库的id当前最大值是11,当执行插入的时候,因为id是主键自增长,写库的id最大值是12,假设这个时候写库还没有把数据同步到读库,这个时候执行select LAST_INSERT_ID,返回的是11。这就是串单的原因。
- 打个比方说
产生串单的条件
- 数据库读写分离
- 写库数据没有及时同步到读库,这个时候执行LAST_INSERT_ID函数
LAST_INSERT_ID详解(针对当前客户端连接)
自动返回最后一个INSERT插入数据的自增长主键的值。
##注意
- last_insert_id是针对当前客户端连接的,只会返回当前客户单插入数据的主键id。其他客户端插入生成的主键id对当前客户端无影响。
- 打个比方说:
- A客户端执行一个插入操作,生成的主键id是12,B客户端执行插入操作,生成的主键id是13,那么A客户端调用该函数返回的值还是12,而不是13。
- 打个比方说:
- 假如你使用一条INSERT语句插入多个行, LAST_INSERT_ID() 只会返回插入的第一行数据时产生的值。
- 打个比方说:
- 我插入了2条数据,它们的生成的主键id分别是12,13,调用该函数只会返回12.
- 打个比方说: