2009-03-06 13 views
2

Angenommen, ich habe zwei Tabellen, Benutzer und Gruppen, von denen jede einen automatisch inkrementierenden Primärschlüssel hat. Wenn ein neuer Benutzer erstellt wird, möchte ich eine Gruppe mit diesem Benutzer (zur gleichen Zeit/derselben Transaktion) erstellen. Die Benutzer müssen jedoch wissen, welcher Gruppe sie angehören, daher speichert jeder Benutzer eine group_id.Autoincrement-ID innerhalb der Transaktion reservieren

Um dies zu tun, ich erstellen und fügen Sie eine Gruppe in die Datenbank, herauszufinden, was der Primärschlüssel der Gruppe, die ich gerade eingefügt wurde, und schließlich den Benutzer mit dem Primärschlüssel dieser neuen Gruppe einfügen.

beachte, dass ich die Gruppe, zu der Datenbank verpflichten müssen (wodurch sie außerhalb einer Transaktion, die mit dem Benutzer als auch zu begehen), um den Primärschlüssel zugewiesen wurde, zurückzuholen.

Obwohl dies in den meisten Situationen funktioniert, wenn es eine Art von Fehler (Stromausfall, Systemabsturz, etc.) zwischen dem Einfügen der Gruppe und finden Sie ihren Primärschlüssel, und wenn ich den Benutzer einfügen, ich wird mit einer inkonsistenten Datenbank enden.

Gibt es eine Möglichkeit, etwas zu tun wie einen Primärschlüssel vorübergehend zu reservieren, so dass, wenn das System abstürzt, wird es nicht in einem inkonsistenten Zustand enden?

Ich bin in erster Linie mit MySQL-Datenbanken beschäftigt, aber wenn es etwas in Standard-SQL gibt, die mir erlauben wird (und damit kompatibel zu anderen Datenbank-Backends), bin ich auch daran interessiert zu wissen.

Antwort

2

Einfach, einfach beide Operationen in eine Transaktion. Starten Sie die Transaktion, erstellen Sie die Gruppe, erstellen Sie den Benutzer und bestätigen Sie die Transaktion.

SET autocommit = 0 

START TRANSACTION 

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

COMMIT 

Sie haben würden, einen Motor zu verwenden, der zwar zu arbeiten, um für die Transaktionen, wie InnoDB, für Ihre Tabellen unterstützt, um. Die standardmäßige MyISAM-Engine unterstützt keine Transaktionen.

+0

Ich hätte klarstellen müssen: Ich muss die Gruppe in die Datenbank verpflichten, um zu wissen, was ihr Primärschlüssel war. Dann kann ich den Benutzer mit der ID der Gruppe verpflichten. Das hindert mich daran, die beiden in der gleichen Transaktion zu kombinieren. –

+0

das ist traurig. kannst du zu einem echten rdbms wechseln oder bist du festgefahren? –

0

Wenn Sie Transaktionen verwenden, dann haben Sie kein Problem.

Verwandte Themen