在一些项目中 , 经常接触分表 .

比如 : 商品信息 和 商品的详情 , 是分开的两个表 . dt_mall和dt_mall_content;

当我dt_mall插入一条数据的时候 , 如果插入成功  , 还要在dt_mall_content表里 , 插入一个同id的content ;

这个时候 , 可以使用 select LAST_INSERT_ID() 将上一个操作成功的id取出来 .

select LAST_INSERT_ID() // 自动返回最后一个INSERT或 UPDATE 查询中 AUTO_INCREMENT列设置的第一个表发生的值。

 

有人会问 , 如果是高并发的情况呢 , 别人也在插入数据 , 会不会得到他插入的那个id , 而不是自己想要的结果?


第一、查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的。
第二
、LAST_INSERT_ID是与表无关的,如果向表a插入数据后再向表b插入数据,LAST_INSERT_ID返回表b的Id值。
第三
、假如你使用一条INSERT语句插入多个行,  LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。
第四
、假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT 计数器不会增量,而 LAST_INSERT_ID() 返回0, 这反映出没有插入任何记录。

根据这四条原则,我们讨论的高并发网站访问时的插入后取自增长值其实主要是跟第一条规则和第二条规则有关。即要保证LAST_INSERT_ID的正确性,必须同一个connection,并且LAST_INSERT_ID要紧跟在insert中执行。所以如果是数据库缓存池公用connection可能会出问题,多线程操作在insert后面由执行了别的insert时也会出问题。

而php的数据库连接本身是页面级的,这样就保证了不会出现缓冲池的情况,然后php页面执行本身也是单线程的,这样就保证了顺序编写的LAST_INSERT_ID肯定是紧跟在insert之后执行的,中间不会有别的insert执行。

综上所述,php的页面级、单线程其实已经保证了mysql的LAST_INSERT_ID天然就是正确的,跟高并发并没有关系。即php中,mysql的LAST_INSERT_ID总是正确的,随便用吧,没有问题的。


相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!