将键从一个表的行分配给行到另一个并发问题

时间:2012-01-14 06:32:30

标签: php mysql sql database-design relational-database

在users表中我添加了新行,这些行每个都需要包含一个引用另一个“访问键”表中唯一行的id。

可以从许多线程同时添加其中一些用户行。我知道这些将是数据库阻塞与写入,所以不是真正的同时。那么也许这不是一个问题?

所以我有一个创建新用户行的php脚本,并且我的访问密钥表填充了许多行。如何在“访问密钥”表中生成对唯一行的id的引用,如何知道它是唯一的?

2 个答案:

答案 0 :(得分:2)

“我的意思是如何获取当前未分配给任何用户行的下一个”访问密钥“ID。如何跟踪哪些尚未使用以便知道要写入哪一个用户表。“

如果您希望这可以绝对保证永远不会出错,那么您的所有“添加用户”事务都应该完全序列化。即它们不可能同时执行。

当任何交易正在进行时,可能正在改变对该问题的答案的过程中,无法得到“当前哪些访问密钥未被使用”这一问题的明确答案。

您可以通过散列用户标识或用户名或类似的东西来生成访问密钥,而不是从池中检索准备好的访问密钥吗?如果是这样,我会这样做。

如果没有,您将不得不接受完整的序列化(即事务延迟以及可能偶尔的事务超时),否则您将不得不接受事情可能出错的事实。

请注意,“接受完整序列化”不一定有问题。如果你的交易时间很短(即你快速提交),那么你很可能不会注意到序列化。

答案 1 :(得分:1)

您可以从正在进行插入的任何线程中按顺序执行此操作:

1)向用户表添加行
2)检索这个新行的ID 3)使用在#2中检索的ID插入访问密钥表 4)转到1)直到完成

MySQL可以安全地返回它作为每个连接的插入查询的一部分创建的最后一个ID - 某个OTHER线程完成的插入不会覆盖另一个线程的“最后一个插入ID” - 每个连接上保留的最后一个插入ID基础。

使用这种结构,你可以拥有任意数量的线程来插入,并且它们都不会踩到彼此的脚趾,因为它们都得到了自己独特的“最后一个id”。