加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用mysql_last_id()的竞争条件

发布时间:2020-12-13 21:44:56 所属栏目:PHP教程 来源:网络整理
导读:我花了大部分时间试图找到答案,但似乎没有一个在那里.我需要在表中创建一行的函数,从插入的行中检索自动增量,然后使用该值在第二个表中插入另一行.功能类似于以下php的东西: $mysql_query("INSERT INTO table1 SET columns='values'");$id = mysql_insert_i
我花了大部分时间试图找到答案,但似乎没有一个在那里.我需要在表中创建一行的函数,从插入的行中检索自动增量,然后使用该值在第二个表中插入另一行.功能类似于以下php的东西:

$mysql_query("INSERT INTO table1 SET columns='values'");
$id = mysql_insert_id();
$mysql_query("INSERT INTO table2 SET id='$id',columns='values'");

我遇到的问题是,在我的应用程序中,所有类之间共享一个MySQL连接,所以我担心这可能会导致竞争条件,其中另一个类在运行第一行和第二行之间插入一行上面提到的.

我能提出的最简单的解决方案是使用mysql_insert_id()打开一个新的,唯一的连接的任何函数,但这似乎是一个巨大的不必要的开销.我玩过的其他答案包括插入一个唯一值(可能是用UUID()创建)并使用它而不是自动增量值,或者可能在存储函数中放入第一个插入和调用LAST_INSERT_ID()(虽然我不确定这是否能解决可能的竞争条件).

我也一直在调查事务以查看它们是否有帮助,但是几乎没有关于mysql_insert_id()与它们如何交互的文档.我可以告诉他们,他们可能在这里没有帮助,因为另一个与任何事务锁没有冲突的INSERT仍然可以执行并可能导致相同的竞争条件.

所以,假设我没有与上述任何一个错误(如果我是,请纠正我),确保100%第二个INSERT使用正确值的最佳方法是什么?

解决方法

php脚本的执行是线性的,而不是多线程的.
所以,当一个对象与另一个对象同时执行时,这是不可能的

唯一可能的问题可能是持久连接.但似乎无论如何,两个单独的呼叫都不能使用相同的连接.即使它是持久的,如果它已经在使用 – 它不能被另一个脚本使用.因此,也没有问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读