SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite-Transaktion

Zusammenfassung :In diesem Tutorial zeigen wir Ihnen, wie Sie die SQLite-Transaktion verwenden, um die Integrität und Zuverlässigkeit der Daten sicherzustellen.

SQLite &ACID

SQLite ist eine Transaktionsdatenbank, bei der alle Änderungen und Abfragen atomar, konsistent, isoliert und dauerhaft (ACID) sind.

SQLite garantiert, dass alle Transaktionen ACID-konform sind, selbst wenn die Transaktion durch einen Programmabsturz, Betriebssystem-Dump oder Stromausfall des Computers unterbrochen wird.

  • A tomic:Eine Transaktion sollte atomar sein. Das bedeutet, dass eine Veränderung nicht in kleinere zerlegt werden kann. Wenn Sie eine Transaktion festschreiben, wird entweder die gesamte Transaktion angewendet oder nicht.
  • C persistent:Eine Transaktion muss sicherstellen, dass die Datenbank von einem gültigen Zustand in einen anderen geändert wird. Wenn eine Transaktion startet und eine Anweisung zum Ändern von Daten ausführt, wird die Datenbank inkonsistent. Wenn die Transaktion jedoch festgeschrieben oder zurückgesetzt wird, ist es wichtig, dass die Transaktion die Datenbank konsistent hält.
  • Ich Isolierung:Eine anstehende Transaktion, die von einer Sitzung ausgeführt wird, muss von anderen Sitzungen isoliert werden. Wenn eine Sitzung eine Transaktion startet und INSERT ausführt oder UPDATE Anweisung zum Ändern der Daten, sind diese Änderungen nur für die aktuelle Sitzung sichtbar, nicht für andere. Andererseits sollten die Änderungen, die von anderen Sitzungen nach dem Start der Transaktion übernommen wurden, für die aktuelle Sitzung nicht sichtbar sein.
  • Dauerhaft:Wenn eine Transaktion erfolgreich festgeschrieben wird, müssen die Änderungen unabhängig von der Bedingung wie Stromausfall oder Programmabsturz in der Datenbank dauerhaft sein. Wenn das Programm dagegen abstürzt, bevor die Transaktion festgeschrieben ist, sollte die Änderung nicht bestehen bleiben.

SQLite-Transaktionsanweisungen

Standardmäßig arbeitet SQLite im Auto-Commit-Modus. Das bedeutet, dass SQLite für jeden Befehl die Transaktion automatisch startet, verarbeitet und festschreibt.

Um eine Transaktion explizit zu starten, verwenden Sie die folgenden Schritte:

Öffnen Sie zuerst eine Transaktion, indem Sie den BEGIN TRANSACTION ausgeben Befehl.

BEGIN TRANSACTION;Code language: SQL (Structured Query Language) (sql)

Nach Ausführung der Anweisung BEGIN TRANSACTION , ist die Transaktion offen, bis sie explizit festgeschrieben oder zurückgesetzt wird.

Geben Sie zweitens SQL-Anweisungen aus, um Daten in der Datenbank auszuwählen oder zu aktualisieren. Beachten Sie, dass die Änderung nur für die aktuelle Sitzung (oder den aktuellen Client) sichtbar ist.

Drittens, schreiben Sie die Änderungen in die Datenbank, indem Sie COMMIT verwenden oder COMMIT TRANSACTION Erklärung.

COMMIT;Code language: SQL (Structured Query Language) (sql)

Wenn Sie die Änderungen nicht speichern möchten, können Sie mit ROLLBACK einen Rollback durchführen oder ROLLBACK TRANSACTION Aussage:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

SQLite-Transaktionsbeispiel

Wir erstellen zwei neue Tabellen:accounts und account_changes für die Vorführung.

Die accounts Tabelle speichert Daten über die Kontonummern und deren Salden. Die account_changes Tabelle speichert die Änderungen der Konten.

Erstellen Sie zuerst die accounts und account_changes Tabellen, indem Sie den folgenden CREATE TABLE verwenden Anweisungen:

CREATE TABLE accounts ( 
	account_no INTEGER NOT NULL, 
	balance DECIMAL NOT NULL DEFAULT 0,
	PRIMARY KEY(account_no),
        CHECK(balance >= 0)
);

CREATE TABLE account_changes (
	change_no INT NOT NULL PRIMARY KEY,
	account_no INTEGER NOT NULL, 
	flag TEXT NOT NULL, 
	amount DECIMAL NOT NULL, 
	changed_at TEXT NOT NULL 
);Code language: SQL (Structured Query Language) (sql)

Zweitens fügen Sie einige Beispieldaten in die accounts ein Tabelle.

INSERT INTO accounts (account_no,balance)
VALUES (100,20100);

INSERT INTO accounts (account_no,balance)
VALUES (200,10100);
Code language: SQL (Structured Query Language) (sql)

Drittens, fragen Sie Daten aus den accounts ab Tabelle:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Als viertes übertragen Sie 1000 von Konto 100 auf 200 und protokollieren die Änderungen in der Tabelle account_changes in einer einzigen Transaktion.

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 1000
 WHERE account_no = 100;

UPDATE accounts
   SET balance = balance + 1000
 WHERE account_no = 200;
 
INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',1000,datetime('now'));

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(200,'+',1000,datetime('now'));

COMMIT;Code language: SQL (Structured Query Language) (sql)

Fragen Sie fünftens Daten von den accounts ab Tabelle:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Wie Sie sehen können, wurden die Salden erfolgreich aktualisiert.

Fragen Sie sechstens den Inhalt von account_changes ab Tabelle:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Nehmen wir ein weiteres Beispiel für das Rollback einer Transaktion.

Versuchen Sie zuerst, 20.000 von Konto 100 abzubuchen:

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 20000
 WHERE account_no = 100;

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',20000,datetime('now'));Code language: SQL (Structured Query Language) (sql)

SQLite hat einen Fehler ausgegeben, weil das Guthaben nicht ausreicht:

[SQLITE_CONSTRAINT]  Abort due to constraint violation (CHECK constraint failed: accounts)Code language: CSS (css)

Das Protokoll wurde jedoch unter account_changes gespeichert Tabelle:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Setzen Sie zweitens die Transaktion mit ROLLBACK zurück Aussage:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

Fragen Sie abschließend Daten aus den account_changes ab Tabelle sehen Sie, dass die Änderung Nr. 3 nicht mehr vorhanden ist:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

In diesem Tutorial haben Sie gelernt, wie Sie mit SQLite-Transaktionen umgehen, indem Sie BEGIN TRANSACTION verwenden , COMMIT , und ROLLBACK Anweisungen zur Steuerung der Transaktionen in der SQLite-Datenbank.