Генерация собственных первичных идентификаторов (безопасных транзакций и т. Д.) С помощью доктрины2 - PullRequest
1 голос
/ 09 декабря 2011

Я борюсь со следующей проблемой, касающейся первичных идентификаторов в mysql:

Я получил сущность Client и сущность Purchase, где один клиент имеет ноль для множества покупок, а покупка имеет точноодин клиент.

Когда я создаю покупку, я хочу назначить свой собственный первичный ключ, который ссылается на клиента, и текущий номер, например abc1, для первой покупки для клиента abc.Таблица покупок может выглядеть следующим образом:

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

Мое приложение использует symfony2 с doctrine2, поэтому я некоторое время искал и думал, а затем реализовал метод createPurchase в PurchaseRepository, который считывает количество покупок для определенногоклиент добавляет один и возвращает созданную покупку с уже добавленным идентификатором:

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

    return new Purchase($id);
}

В этом решении есть некоторые проблемы:

  • Добавление нескольких объектов без сброса приводит кдублированный первичный идентификатор
  • Одновременный запуск сценария может привести к дублированию первичных идентификаторов

Есть ли другой способ, о котором я сейчас не знаю, который может решить мои проблемы?Я делаю это совершенно неправильно?Любая помощь приветствуется!

1 Ответ

2 голосов
/ 09 декабря 2011

Вот почему существует функция AUTO_INCREMENT, поэтому параллельные транзакции могут генерировать уникальные значения первичного ключа.

Чтобы сделать это с вашим собственным кодом, вам придется использовать LOCK TABLES Purchase WRITE перед тем, каквызов getAmountForClient(), чтобы предотвратить состояние гонки с другими транзакциями, которое вызывает ошибки дублирующегося ключа.

Никто не делает этого. Они отказываются от идеи пользовательских первичных ключей, как вы описали,и вместо этого просто используйте AUTO_INCREMENT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...