我在mysql数据库上有一个注册程序,它的工作原理如下:
INSERT INTO `tblusers` (`uname`, `upwd`, `umail`) VALUES (RU_UNAME, RU_UPWD, RU_UMAIL);
select LAST_INSERT_ID() into @newuserid;
-- then use the @newuserid to make some work on other tables.
现在我想知道它是否会得到错误的id特别是数据库将在其他表中有很多插入,然后它可能会获得插入用户和获取最后插入的id之间插入的另一个表的id ?
是否有可能失败?
答案 0 :(得分:1)
总之,没有。与数据库的不同连接保持各自的LAST_INSERT_ID
。因此,将记录插入tblusers
的其他一些客户端不会影响您的LAST_INSERT_ID
。
生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
documentation值得一读。它解释了很多细节。
答案 1 :(得分:0)
MySQL使用锁系统,它不允许2个进程(对脚本进行2次调用)来修改同一行。因此表格不会崩溃*,但MySQL可能无法在合理的时间内处理请求数量,请求将等待。您应始终尽可能快地优化查询。
所以,最后插入的id不会失败。