Die Gewährleistung Atomicity sql
Frage
Ich war gerade über RDBMS Lesen, und eine Eigenschaft eines RDBMS Unteilbarkeit. So wird, wenn das Geld zurück von einem Konto und übertragen eine andere, entweder die Transaktion wird passieren, vollständig oder nicht überhaupt. Es gibt keinen Teil Transaktionen. Aber wie ist eigentlich gewährleistet?
SQL-Abfragen für das oben beschriebene Szenario
könnte so aussehen
(I) UPDATE accounts
eingestellten Balance = Balance - Menge WHERE ac_num = 101
(Ii) UPDATE accounts
eingestellten Balance = + Balance Menge WHERE ac_num = 102
Welche keineswegs gewährleistet, Unteilbarkeit .. Wie funktioniert es eigentlich passieren?
Lösung
Wenn Sie das tun
BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION
Das Datenbanksystem wird die Noten schreiben, was für Änderungen am Konto 101 erfolgt ist, und dann, wenn die Arbeit wegen 102 fehlschlagen würde, verwendet das RDBMS diese Notizen, die Arbeit auf 101 rückgängig zu machen.
Darüber hinaus, wenn es Arbeit für 101 nimmt eine Sperre für die Datenbank gestartet wird, so dass niemand sonst kommen kann und die aktualisierte, aber nicht festgeschriebenen Daten in Konto 101 gelesen. (Schloß hier ist im Grunde nur eine Note irgendwo „Ich arbeite hier, nicht berühren.“)
Andere Tipps
Um atomar, müssen Transaktionen:
- andere Transaktionen verhindern stören den Reihen sie schreiben oder zu lesen
- Stellen Sie sicher, dass entweder alle oder keine der Änderungen, dass die Transaktion macht, in der Datenbank sein wird, wenn die Transaktion festgeschrieben.
Zuerst ist man erreicht von Sperr Zeilen, die die Transaktion liest oder schreibt während er die Ausführung ist.
Zweite ist so geschehen, dass die Transaktionen ihre Aktionen in einen Transaktionsprotokoll href="http://en.wikipedia.org/wiki/Transaction_log" schreiben. Dies macht die Datenbank in der Lage, selbst zu erholen, wenn der Server Leistung während einer Transaktion verliert. In diesem Fall liest der Wiederherstellungsprozess das Protokoll, stellen Sie sicher, dass die aktiven (Uncommited) Transaktionen abgebrochen erhalten und von ihnen vorgenommenen Änderungen werden gelöscht.