2014-01-06 59 views
1

在我的应用我想这样做MySql事务是否互斥?

1) INSERT INTO APPLICATION VALUES(...); 

然后,我想找回插入到应用程序表中的最后一条记录的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.ID将存储在INFO.A_ID中。

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

回答

2

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

“对于LAST_INSERT_ID(),最近生成的ID保持在每个连接的基础服务器时,它不会被另一个客户端改变

它甚至没有改变。如果你有一个值魔法的更新另一个AUTO_INCREMENT柱(即值不为NULL,而不是0)。

从含多处同时使用LAST_INSERT_ID()AUTO_INCREMENT列客户是完全有效的。

+0

谢谢@ gfrobenius,它应该解决问题:) – smit

1

我会强烈反对LAST_INSERT_ID(),因为它可能在表中插入同步的情况下,抛错了ID ...

例如...如果你有2个同步交易,你想获得2事务ID的第一次..... last_insert_id()会在这里失败,因为它不知道这是最后一次正确的插入

改用mysqli->insert_id

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

参考mysqli.insert-id

+0

不,他们是完全一样的东西。 LAST_INSERT_ID()被限制在会话中,并且永远不会给出由另一个会话生成的值。 –

+0

只是一个疑问..有可能'用户'可以在单个会话中做2个交易? :| – NoobEditor

+0

是的,单个会话可以由多个串行事务组成,但这并不重要。无论事务如何,MySQL都会报告当前会话中生成的最后一个自动增量值。 –