并发访问PHP+;MySQL存在ID生成问题

并发访问PHP+;MySQL存在ID生成问题,php,mysql,database,concurrency,primary-key,Php,Mysql,Database,Concurrency,Primary Key,在InnoDB MySQL存储引擎中,一个存储过程用于生成形式为tbaaa000000的主键值 密钥生成 因此,主键的格式为: 对于固定长度,例如l,第一个两个字符表示表格名称,下一个m为字母,其余(l-2-m)为数字(仅为数字) 存储过程已编码为使用动态SQL手动递增最右边的m+n字符块。这是通过查找表中存在的最大ID(例如tbaaa999999)并将其递增(到tbaab000000)来完成的。所谓动态SQL,我的意思是它已经被用来在运行时通过在查询中合并变量动态地构建SQL语句 提交表格 假

在InnoDB MySQL存储引擎中,一个存储过程用于生成形式为
tbaaa000000
的主键值

密钥生成 因此,主键的格式为: 对于固定长度,例如
l
,第一个
两个
字符表示表格名称,下一个
m
为字母,其余(
l-2-m
)为数字(仅为数字)

存储过程已编码为使用动态SQL手动递增最右边的
m+n
字符块。这是通过查找表中存在的最大ID(例如
tbaaa999999
)并将其递增(到
tbaab000000
)来完成的。所谓动态SQL,我的意思是它已经被用来在运行时通过在查询中合并变量动态地构建SQL语句

提交表格 假设我们正试图为表
Table1
生成此主键。另外,我们还有另一个表(比如
Table2
),它引用了
Table1
的主键(
Table2
Table1
上有一个外键)

现在,使用PHP脚本将表单提交到服务器,该脚本将表单数据插入
Table1
Table2
。但是,主键ID是在执行
Table1
的查询过程中使用存储过程生成的,但即使是
Table2
的插入查询也需要此ID,而PHP脚本中不知道该ID

此外,可能有多个客户端试图访问该页面,因此PHP脚本将为所有用户运行,因此生成存储过程可能会为多个用户生成相同的主键ID

我的问题是:
  • 由于请求的并发性,如何在
    表1
    中管理唯一ID的生成和插入
  • 如何在PHP脚本中获取表1生成的主键,以便插入到
    Table2
  • 所以鼓励我把我所做的努力也包括在内。然而,我不希望答案的范围受到限制,所以请在阅读我的试验之前尝试思考一种方法

    我想到的方法是: 我们可以从PHP脚本调用一个过程,该过程将插入数据作为参数,生成
    Table1
    的主键ID,并将数据插入两个表中。但是,这将失败,因为整个过程仍然可以为并发请求生成相同的ID


    我还探索了PHP脚本端的
    try-catch
    方法,该方法将调用一个函数来生成ID并将其返回到PHP脚本。然后,这将尝试插入到
    表1
    中,如果相同的ID已经存在(可能是由于另一个用户同时进行另一个插入处理),该操作将失败,并引发
    重复密钥异常
    ,然后再次尝试生成,从而给出唯一性。但是,我不确定这种方法是否有效,因为这可能会导致性能问题。

    这就是事务的用途。您需要执行的伪代码是:

  • 启动事务
  • 获取表1中的最高ID
  • 增加这个
  • 将新行存储在表1中
  • 提交事务

  • 如果另一个客户端在发生这种情况时试图访问表1,它们将被阻止,直到事务提交。

    谢谢。我探讨了这种方法,但需要澄清的是,为了让事务正常工作,我必须在MySQL中提到什么?我必须保持事务可序列化吗?类似于?我认为默认设置应该可以处理大多数情况。另一个问题中的问题是不同表之间的异常同步,但这不是您的问题。谢谢您的讨论!我将尝试测试并发性,然后将此答案标记为已接受:)