【问题标题】:UIDs for data objects in MySQLMySQL 中数据对象的 UID
【发布时间】:2010-06-02 09:13:26
【问题描述】:

我正在使用 C++ 和 MySQL。

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

这是我想出的:

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

2) 在 C++ 端生成 UID。也没有骰子。有多个程序将写入和读取数据库,它们彼此不知道。

3) 以 MAX(uid)+1 作为 uid 值插入。但是,我基本上遇到了与 1) 相同的问题,因为我们仍然有竞争条件。

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

有什么想法吗?

【问题讨论】:

    标签: c++ mysql uniqueidentifier


    【解决方案1】:

    查询:

    SELECT LAST_INSERT_ID()
    

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

    【讨论】:

    • 无论如何你都可能需要锁。如果我没记错的话,大多数语言中的大多数数据库库通常都不是线程安全的,更不用说LAST_INSERT_ID 上的潜在竞争条件。
    • @Dave mySQL 确实提供了线程安全的客户端库 - 请参阅 dev.mysql.com/doc/refman/5.0/fr/myodbc-unix-thread-safe.html。当然,你仍然需要锁来避免竞争条件。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2012-07-21
    相关资源
    最近更新 更多