Ringkasan :dalam tutorial ini, kami akan menunjukkan cara menggunakan transaksi SQLite untuk memastikan integritas dan keandalan data.
SQLite &ACID
SQLite adalah database transaksional yang semua perubahan dan kuerinya bersifat atomik, konsisten, terisolasi, dan tahan lama (ACID).
SQLite menjamin semua transaksi sesuai dengan ACID bahkan jika transaksi terganggu oleh crash program, sistem operasi dump, atau kegagalan daya ke komputer.
- A tomic:transaksi harus atomik. Artinya, suatu perubahan tidak dapat dipecah menjadi yang lebih kecil. Saat Anda melakukan transaksi, seluruh transaksi diterapkan atau tidak.
- C onsistent:transaksi harus memastikan untuk mengubah database dari satu status valid ke status lainnya. Ketika transaksi dimulai dan mengeksekusi pernyataan untuk mengubah data, database menjadi tidak konsisten. Namun, ketika transaksi dilakukan atau dibatalkan, penting bahwa transaksi harus menjaga database tetap konsisten.
- Saya solation:transaksi tertunda yang dilakukan oleh sesi harus diisolasi dari sesi lain. Saat sesi memulai transaksi dan mengeksekusi
INSERT
atauUPDATE
pernyataan untuk mengubah data, perubahan ini hanya terlihat pada sesi saat ini, bukan yang lain. Di sisi lain, perubahan yang dilakukan oleh sesi lain setelah transaksi dimulai seharusnya tidak terlihat oleh sesi saat ini. - Tahan lama:jika transaksi berhasil dilakukan, perubahan harus permanen dalam database terlepas dari kondisi seperti kegagalan daya atau program crash. Sebaliknya, jika program mogok sebelum transaksi dilakukan, perubahan tidak akan berlanjut.
Pernyataan transaksi SQLite
Secara default, SQLite beroperasi dalam mode komit otomatis. Artinya, untuk setiap perintah, SQLite memulai, memproses, dan melakukan transaksi secara otomatis.
Untuk memulai transaksi secara eksplisit, Anda menggunakan langkah-langkah berikut:
Pertama, buka transaksi dengan mengeluarkan BEGIN TRANSACTION
perintah.
BEGIN TRANSACTION;
Code language: SQL (Structured Query Language) (sql)
Setelah mengeksekusi pernyataan BEGIN TRANSACTION
, transaksi terbuka hingga dilakukan atau dibatalkan secara eksplisit.
Kedua, mengeluarkan pernyataan SQL untuk memilih atau memperbarui data dalam database. Perhatikan bahwa perubahan hanya dapat dilihat oleh sesi (atau klien) saat ini.
Ketiga, komit perubahan ke database dengan menggunakan COMMIT
atau COMMIT TRANSACTION
pernyataan.
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Jika Anda tidak ingin menyimpan perubahan, Anda dapat memutar kembali menggunakan ROLLBACK
atau ROLLBACK TRANSACTION
pernyataan:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
Contoh transaksi SQLite
Kami akan membuat dua tabel baru:accounts
dan account_changes
untuk demonstrasi.
accounts
tabel menyimpan data tentang nomor rekening dan saldonya. account_changes
tabel menyimpan perubahan akun.
Pertama, buat accounts
dan account_changes
tabel dengan menggunakan CREATE TABLE
berikut ini pernyataan:
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)
Kedua, masukkan beberapa contoh data ke dalam accounts
tabel.
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)
Ketiga, kueri data dari accounts
tabel:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Keempat, transfer 1000 dari akun 100 ke 200, dan catat perubahannya ke tabel account_changes
dalam satu transaksi.
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)
Kelima, query data dari accounts
tabel:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Seperti yang Anda lihat, saldo telah berhasil diperbarui.
Keenam, kueri konten account_changes
tabel:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Mari kita ambil contoh lain untuk membatalkan transaksi.
Pertama, coba kurangi 20.000 dari akun 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 mengeluarkan kesalahan karena saldo tidak cukup:
[SQLITE_CONSTRAINT] Abort due to constraint violation (CHECK constraint failed: accounts)
Code language: CSS (css)
Namun, log telah disimpan ke account_changes
tabel:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Kedua, lakukan rollback transaksi dengan menggunakan ROLLBACK
pernyataan:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
Terakhir, kueri data dari account_changes
tabel, Anda akan melihat bahwa perubahan no #3 sudah tidak ada lagi:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Dalam tutorial ini, Anda telah mempelajari cara menangani transaksi SQLite dengan menggunakan BEGIN TRANSACTION
, COMMIT
, dan ROLLBACK
pernyataan untuk mengontrol transaksi dalam database SQLite.