2010-06-02 58 views
1

我正在使用C++和MySQL。MySQL中用于数据对象的UID

我有我想要坚持到数据库的数据对象。他们需要有一个唯一的ID用于识别目的。问题是,如何获得这个唯一的ID?

这里是我想出了:

1)使用MySQL的AUTO_INCREMENT功能。但是如何获得ID呢?我知道MySQL提供了这个“SELECT LAST_INSERT_ID()”功能,但这将是一个竞争条件,因为两个对象可以相互快速插入。此外,没有其他东西可以辨别对象。使用完全相同的数据可以同时创建两个对象。

2)在C++端生成UID。没有骰子。有多个程序会写入数据库并从数据库中读取,这些程序彼此不知道。

3)插入MAX(uid)+1作为uid值。但是,我基本上有和1)一样的问题,因为我们仍然存在竞争条件。

现在我很难过。我假设这个问题一定是其他人遇到的问题,但到目前为止,我没有找到任何答案。

任何想法?

回答

0

查询:

SELECT LAST_INSERT_ID() 

将返回插入特定连接上的最后一个ID,而不是全局。所以没有竞争条件,除非你自己的代码是多线程的,在这种情况下,你会想要用某种MT锁来包围INSERT和SELECT。

+0

无论如何你可能需要锁。如果我没有记错,大多数语言中的大多数数据库库一般都不是线程安全的,不必介意'LAST_INSERT_ID'上的潜在竞争条件。 – 2010-06-02 09:28:43

+0

@Dave mySQL确实提供了一个线程安全客户端库 - 请参阅http://dev.mysql.com/doc/refman/5.0/fr/myodbc-unix-thread-safe.html。当然,你仍然需要锁来避免竞争状态。 – 2010-06-02 09:33:15

+0

非常感谢! – 2010-06-02 09:35:48