使用doctrine2生成自己的主要ID(transactionsafe等)

时间:2011-12-08 20:17:46

标签: mysql symfony doctrine-orm

我正在努力解决有关mysql中主要ID的以下问题:

我有一个实体Client和一个实体Purchase,其中一个客户购买零到多,购买只有一个客户。

当我创建购买时,我想分配我自己的主键,该主键引用客户端和正在进行的号码,例如abc1,用于第一次购买客户端abc。购买表可能如下所示:

id   | client
abc1 | abc
abc2 | abc
def1 | def
abc3 | abc
def2 | def

我的应用程序使用symfony2和doctrine2,所以我搜索并思考了一段时间,然后在PurchaseRepository中实现了一个createPurchase方法,该方法读取特定客户的购买量,添加一个并返回已添加id的已创建Purchase :

public function createPurchase($client){
    $amount = $this->getAmountForClient($client) + 1;
    $id= $client->getId() . $amount ;

    return new Purchase($id);
}

此解决方案存在一些问题:

  • 在没有刷新的情况下添加多个实体会导致公开的主要ID
  • 同时运行脚本可能会导致出现主要的主要ID

我现在还有另一种方法可以解决我的问题吗?我这样做完全错了吗?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

这就是AUTO_INCREMENT功能存在的原因,因此并发事务可以生成唯一的主键值。

要使用您自己的代码执行此操作,您必须在调用getAmountForClient()之前使用LOCK TABLES Purchase WRITE,以防止与导致重复键错误的其他事务的竞争条件。

没有人这样做。他们放弃了你所描述的自定义主键的想法,而只是使用AUTO_INCREMENT。