我需要事务来获得序列中正确的最后一个插入的id吗?

i7uaboj4  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(286)

我有一个名为products的数据库表,我试图在表中插入一个产品a,并在插入到表中后返回产品a的id。我的php代码如下:

public function save(Product $product) : int
    {   
        $stmt = $this->conn->prepare(
          "INSERT INTO products VALUES(null, ?, ?, ?, ?)"
        );
        $error = ! $stmt->execute([
          $product->name,
          $product->description,
          $product->picturePath,
          $product->userId,
        ]);
        return $error ? -1 : $this->conn->lastInsertId('products.id');   
    }

我在考虑这个代码可能存在的问题,我想到的第一个问题是:如果客户请求在表中插入产品a,并且在我获得产品a的id之前,又请求插入产品b,我会获得产品b的id吗?对?如果没有,为什么不呢?
第二个问题是:如果我使用事务插入产品a并检索它的id,那么我会得到产品a的id吗?

mf98qq94

mf98qq941#

这个 lastInsertId() 值是每个连接维护的,因此如果有其他连接将数据插入到同一个表中,则不必担心这些问题;你的价值就是你的关系。
如果使用成功的事务,然后回滚,则 lastInsertId() 仍将保留其价值。回滚不影响的当前值 lastInsertId() .

utugiqy6

utugiqy62#

你可以用一个 try 以及 catch 并使用pdo begintransaction、commit和rollback函数。示例可以在php上详细介绍pdo:lastinsertid

try { 
        $conn->beginTransaction(); 
        $stmt = conn->prepare(
          "INSERT INTO products VALUES(null, ?, ?, ?, ?)"
        );
        $error = ! $stmt->execute([
          $product->name,
          $product->description,
          $product->picturePath,
          $product->userId,
        ]);
        $id =  $conn->lastInsertId();
        $conn->commit(); 
    } catch(PDOExecption $e) { 
        $conn->rollback(); 
        print "Error!: " . $e->getMessage() . "</br>"; 
    }

在我看来,应用良好的编码实践比一时兴起并希望得到最好的结果要好。:)

xtupzzrd

xtupzzrd3#

我认为您应该没事,因为在mysql中,它绑定到连接,请求应该使用相同的连接。其他请求可能同时递增表中的最高id,但它不应返回这些值。
它在mysql文档中解释得很好
对于最后一个\u insert \u id(),最近生成的id将按每个连接在服务器中进行维护。它不会被其他客户端更改。

相关问题