sql >> Database >  >> RDS >> SQLite

SQLite-transactie

Samenvatting :in deze zelfstudie laten we u zien hoe u de SQLite-transactie kunt gebruiken om de integriteit en betrouwbaarheid van de gegevens te waarborgen.

SQLite &ACID

SQLite is een transactiedatabase waarin alle wijzigingen en zoekopdrachten atomair, consistent, geïsoleerd en duurzaam (ACID) zijn.

SQLite garandeert dat alle transacties ACID-compatibel zijn, zelfs als de transactie wordt onderbroken door een programmacrash, een dump van het besturingssysteem of een stroomstoring naar de computer.

  • A tomic:een transactie moet atomair zijn. Het betekent dat een verandering niet in kleinere kan worden opgesplitst. Wanneer u een transactie uitvoert, wordt ofwel de gehele transactie toegepast of niet.
  • C aanhoudend:een transactie moet ervoor zorgen dat de database van de ene geldige toestand in de andere verandert. Wanneer een transactie start en een instructie uitvoert om gegevens te wijzigen, wordt de database inconsistent. Wanneer de transactie echter wordt vastgelegd of teruggedraaid, is het belangrijk dat de transactie de database consistent houdt.
  • Ik Solation:een lopende transactie uitgevoerd door een sessie moet worden geïsoleerd van andere sessies. Wanneer een sessie een transactie start en de INSERT . uitvoert of UPDATE statement om de gegevens te wijzigen, zijn deze wijzigingen alleen zichtbaar voor de huidige sessie, niet voor anderen. Aan de andere kant mogen de wijzigingen die zijn vastgelegd door andere sessies nadat de transactie is gestart, niet zichtbaar zijn voor de huidige sessie.
  • Duurzaam:als een transactie met succes is doorgevoerd, moeten de wijzigingen permanent in de database zijn, ongeacht de toestand, zoals een stroomstoring of een programmacrash. Integendeel, als het programma crasht voordat de transactie is doorgevoerd, zou de wijziging niet moeten blijven bestaan.

SQLite-transactieoverzichten

Standaard werkt SQLite in de auto-commit-modus. Het betekent dat voor elke opdracht SQLite de transactie automatisch start, verwerkt en vastlegt.

Om een ​​transactie expliciet te starten, gebruikt u de volgende stappen:

Open eerst een transactie door de BEGIN TRANSACTION commando.

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

Na het uitvoeren van de instructie BEGIN TRANSACTION , is de transactie open totdat deze expliciet is vastgelegd of teruggedraaid.

Ten tweede, geef SQL-instructies op om gegevens in de database te selecteren of bij te werken. Merk op dat de wijziging alleen zichtbaar is voor de huidige sessie (of cliënt).

Ten derde, leg de wijzigingen vast in de database met behulp van de COMMIT of COMMIT TRANSACTION verklaring.

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

Als u de wijzigingen niet wilt opslaan, kunt u terugdraaien met de ROLLBACK of ROLLBACK TRANSACTION verklaring:

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

SQLite-transactievoorbeeld

We zullen twee nieuwe tabellen maken:accounts en account_changes voor de demonstratie.

De accounts tabel slaat gegevens op over de rekeningnummers en hun saldi. De account_changes tabel slaat de wijzigingen van de rekeningen op.

Maak eerst de accounts en account_changes tabellen met behulp van de volgende CREATE TABLE uitspraken:

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)

Ten tweede, voeg wat voorbeeldgegevens toe aan de accounts tafel.

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)

Ten derde, gegevens opvragen van de accounts tafel:

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

Ten vierde, zet 1000 over van rekening 100 naar 200 en log de wijzigingen in de tabel account_changes in een enkele transactie.

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)

Ten vijfde, gegevens opvragen van de accounts tafel:

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

Zoals u kunt zien, zijn de saldi met succes bijgewerkt.

Ten zesde, vraag de inhoud van de account_changes tafel:

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

Laten we nog een voorbeeld nemen van het terugdraaien van een transactie.

Probeer eerst 20.000 af te trekken van rekening 100:

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 gaf een fout door onvoldoende saldo:

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

Het logboek is echter opgeslagen in de account_changes tafel:

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

Ten tweede, draai de transactie terug met behulp van de ROLLBACK verklaring:

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

Vraag ten slotte gegevens op uit de account_changes tabel, zult u zien dat de wijziging nr. 3 er niet meer is:

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

In deze zelfstudie hebt u geleerd hoe u omgaat met SQLite-transacties met behulp van de BEGIN TRANSACTION , COMMIT , en ROLLBACK instructies om de transacties in de SQLite-database te controleren.


  1. Telkolom bijwerken vanuit gegevens in een andere tabel

  2. Gegevensmigratie tussen verschillende DBMS's

  3. Hoe voeg ik een tekenreeks toe met een automatische verhogingswaarde in SQL Server?

  4. INVOEREN IN ... SELECTEER UIT ... OP DUPLICATE KEY UPDATE