MySql事务是否互斥?

时间:2014-01-06 06:59:40

标签: php mysql sql transactions

在我的应用程序中,我想做类似

的事情
1) INSERT INTO APPLICATION VALUES(...);

然后我想检索插入到APPLICATION表中的最后一条记录的ID(即AUTO_INCREMENT)并将其存储在另一个表中,如...

2) $last_rec = $this->con->query("SELECT ID FROM APPLICATION ORDER BY ID DESC LIMIT 1");
3) INSERT INTO INFO(A_ID, ...) VALUES($last_rec, ...);

我正在使用事务并且一切正常但我不确定是否另一个事务可以在第1步完成后在APPLICATION中插入一行,如果发生那么错误的APPLICATION.ID将存储在INFO.A_ID中

有关我应该如何处理这种情况的任何建议?

2 个答案:

答案 0 :(得分:2)

阅读本文:http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

“对于LAST_INSERT_ID(),最新生成的ID在每个连接的基础上维护在服务器中。它不会被其他客户端更改。

如果您使用非恶意值(即非NULL且不为0的值)更新另一个AUTO_INCREMENT列,则甚至不会更改。

从多个客户端同时使用LAST_INSERT_ID()AUTO_INCREMENT列完全有效。

答案 1 :(得分:1)

我强烈建议不要使用LAST_INSERT_ID(),因为如果在表格中同时插入,可能会引发错误的ID ...

例如......如果您有2个同时进行的交易并且您希望获得2个交易ID中的第1个..... last_insert_id()将在此处失败,因为它不知道哪个是最后一个正确的插入

改为使用mysqli->insert_id

$result = $mysqli->query( /*insert query here */);
echo 'The ID is: '.$mysqli->insert_id;

参考 mysqli.insert-id