2009-03-06 3 views
2

Скажем, у меня есть две таблицы, пользователи и группы, каждая из которых имеет автоматически увеличивающий первичный ключ. Всякий раз, когда создается новый пользователь, я хотел бы создать группу вместе с этим пользователем (в то же время/одну транзакцию). Тем не менее, пользователи должны знать, к какой группе они принадлежат, поэтому каждый пользователь хранит group_id.Идентификатор автоинкремента резервации Внутри транзакции

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

Отметьте, что мне нужно зафиксировать группу в базе данных (таким образом, она за пределами любой транзакции с фиксацией пользователя), чтобы получить первичный ключ, который был назначен.

Хотя это будет работать в большинстве ситуаций, если есть какие-то сбои (сбой питания, системный сбой и т. Д.) Между тем, когда я вставляю группу и узнаю ее первичный ключ, а когда я вставляю пользователя, я закончится несогласованной базой данных.

Есть ли способ сделать что-то вроде резервирования первичного ключа временно, так что если система выйдет из строя, она не окажется в несогласованном состоянии?

Я в основном занимаюсь базами данных MySQL, но если в стандартном SQL есть что-то, что позволит мне это сделать (и, следовательно, совместимо с другими базами данных), я также заинтересован в том, чтобы это знать.

ответ

2

Просто, просто поместите обе операции в транзакцию. Запустите транзакцию, создайте группу, создайте пользователя, а затем зафиксируйте транзакцию.

SET autocommit = 0 

START TRANSACTION 

INSERT INTO Groups ... 
INSERT INTO Users ... 

COMMIT 

Вы должны использовать двигатель, который поддерживает транзакции, такие как InnoDB, для таблиц для того, чтобы что работать, хотя. Механизм MyISAM по умолчанию не поддерживает транзакции.

+0

Я должен был уточнить: мне нужно передать группу в базу данных, чтобы узнать, каков ее первичный ключ. Затем я могу зафиксировать пользователя с идентификатором группы. Это мешает мне объединить два в одной транзакции. –

+0

это печально. можете ли вы перейти на реальный rdbms или вы застряли? – 2009-03-06 21:40:00

0

Если вы используете транзакции, то у вас не будет проблем.

Смежные вопросы