mysql_insert_id和mysql_pconnect

时间:2011-09-30 01:59:50

标签: php mysql

我一直在使用mysql_pconnect在我的PHP网站上建立所有数据库连接,理论上它更有效(我知道这是有争议的)。

我去使用mysql_insert_id从最近的INSERT中获取ID,并且在我看来,考虑到Web请求的多线程特性,我不能保证使用相同pconnection的另一个PHP脚本已经创建了一个DB INSERT在我调用mysql_insert_id之前。

这是一个很大的交易,因为我看不到保证INSERT和ID检索的原子性的其他方法,因为INSERT查询不返回ID(或者我不知道如何获取它)。 / p>

所以基本上我永远不能使用mysql_pconnect,如果我想要线程安全的INSERTS和ID检索?

2 个答案:

答案 0 :(得分:1)

mysql_insert_id()返回当前连接会话上下文中的最后一个id。从而避免竞争条件问题。关于mysql_insert_id()

的php.net手册,有很多关于此的注释/评论

更多信息:

这应该很容易测试:

<?php
// connection already established
mysql_query("INSERT INTO table VALUES('foo', 'bar')");
sleep(15);
echo mysql_insert_id();

然后看看你是否可以在睡眠期间用请求抨击它来欺骗它..并检查insert_id结果。

答案 1 :(得分:0)

mysql_pconnect意味着连接将不会从php模块关闭到mysql。由于创建新连接存在开销,因此如果要创建大量连接,这将是有益的。

当php在单个线程中执行请求时。很可能你将使用1个数据库连接调用INSERT,随后调用ID检索将是ATOMIC。

1个php线程所使用的MYSQL连接不能被另一个php线程使用,而它仍在使用中,以确保原子性。

相关问题