Php 插入时获取一个表的自动递增值的最佳方法

Php 插入时获取一个表的自动递增值的最佳方法,php,mysql,sql-server,transactions,distributed-transactions,Php,Mysql,Sql Server,Transactions,Distributed Transactions,在我的数据库中有三个表,它们是 posts{ post_id , title , description ,etc ,etc} tags{ tag_id , tag_name , tag_type } tags_for_post{ tag_ref_id , post_ref_id} 所以,正如您所看到的,一旦我在posts表中插入一行,那么我将需要该行的post\u id值来更新我的posts表的标签。也就是说,哪些标签被标记在哪个帖子被存储在tags\u for\u posts表中,为此,我

在我的数据库中有三个表,它们是

posts{ post_id , title , description ,etc ,etc}
tags{ tag_id , tag_name , tag_type }
tags_for_post{ tag_ref_id , post_ref_id}
所以,正如您所看到的,一旦我在
posts
表中插入一行,那么我将需要该行的
post\u id
值来更新我的
posts
表的标签。也就是说,哪些标签被标记在哪个帖子被存储在
tags\u for\u posts
表中,为此,我需要相应的posts
post\u id

因此我的问题是如何在插入时获得自动递增的值(即
post\u id
)?
但存在一个问题

它将在服务器上运行,因此多个客户端将同时访问它。因此,可能会出现两个客户端同时访问
posts
表的情况。那么,我如何确保最后一个插入id()将给出相应的post
post\u id

所以我想分三步来做,比如:

  • posts
    表中输入少数列的数据,并获取此行的自动递增post\u id值
  • 现在,将该行的
    post\u id
    值用于在
    tag\u中插入相应的标签,以用于post
  • 再次来到
    posts
    table完成rest计算和更新
  • 正如我前面所说的,我遇到的主要问题是如何确保即使多个客户端同时访问它,我也始终会获得相应行的
    post\u id
    我不认为
    mysql\u insert\u id
    LAST\u insert\u id()
    可以用于此目的,因为多个客户端可以尝试同时插入。那么我如何确保每次都能获得对应行的id

    现在,在将其标记为重复线程之前,我想说我在google和stackoverflow中搜索了很多,其中大多数建议使用
    mysql\u insert\u id
    LAST\u insert\u id()
    ,正如我所说的,我对此不满意,因为我认为它不会同时提供多个访问所需的结果

    我已经找到了两种可能解决我的问题的解决方案

    在stackoverflow解决方案中,他们说将代码编写为:

    begin transaction
    insert into your table (half empty values);
    $id = get last autoincrement id
    do calculations
    update set data = full data where id = $id
    commit transaction
    
    现在我的问题是:

  • 上面的代码能正确地解决我的问题吗
  • 我是否需要编写额外的代码来实现上述代码
  • 如果使用上述代码无法解决问题,那么我该如何解决
  • 上述代码是否确保即使在同时多次插入的情况下,也始终返回相应的
    post\u id
  • 例如,假设一个客户机发出了
    inseret
    命令,在该客户机发出
    $id=get last autoincrement id
    之前,另一个客户机已经发出了
    insert
    命令。现在第一个客户机将获得他使用上述代码插入的行的id吗

  • 最后一个插入ID对于连接的每个客户端都是唯一的,它只指向该客户端插入的最后一个ID,而不指向其他客户端插入的其他ID

    生成的ID在服务器上的 每个连接的基础。这意味着 给定客户端的函数是生成的第一个自动增量值 对于影响自动增量列的最新语句 客户此值不受其他客户端的影响,即使它们 生成它们自己的自动增量值。这种行为确保 每个客户端都可以检索自己的ID,而不必考虑 其他客户端的活动,并且不需要锁或 交易


    换句话说,如果您考虑了多线程,则不需要为此执行任何类型的锁定。

    那么您有什么建议吗??使用事务处理是否是更好的方法???或者我应该使用该
    最后一个插入ID
    ?,哪一个更安全?获取最后一个插入ID总是安全的,但是如果您需要同时更新这两个表,以防止用户在处理它们时出错访问它们,那么你需要一个事务或锁。yp能详细说明一下吗?我说过我想分三步来做吗?现在你有什么建议吗?我可以在事务中使用
    last\u insert\u id()
    吗?使用事务的缺点是什么?