Kontrol Transaksi di PostgreSQL
Di PostgreSQL, eksekusi operasi transaksi diatur oleh beberapa perintah penting:
BEGIN TRANSACTION
COMMIT
ROLLBACK
Perintah-perintah ini mengontrol tindakan memulai, menyimpan, dan membatalkan transaksi.
Perintah BEGIN TRANSACTION
Ketika mengelola transaksi di PostgreSQL, perintah BEGIN TRANSACTION
merupakan titik awal. Anda dapat memulai transaksi dengan perintah ini, yang biasanya diikuti oleh serangkaian operasi manipulasi data seperti INSERT
, UPDATE
, atau DELETE
.
Saat Anda memulai transaksi dengan perintah BEGIN
atau BEGIN TRANSACTION
, sistem memasuki blok transaksi, di mana semua operasi database selanjutnya menjadi bagian dari transaksi tersebut. Transaksi ini akan berlanjut hingga menemui perintah COMMIT
atau ROLLBACK
berikutnya. Transaksi juga secara otomatis akan dibatalkan (rollback) jika koneksi database ditutup atau jika terjadi kesalahan.
BEGIN;
atau
BEGIN TRANSACTION;
Perintah COMMIT
Setelah melakukan perubahan yang diperlukan dalam transaksi, perintah COMMIT
digunakan untuk menyimpan perubahan-perubahan tersebut ke dalam database. Perintah ini memastikan semua modifikasi yang dilakukan dalam transaksi disimpan dan terlihat oleh transaksi lain. Perintah ini juga menandai akhir blok transaksi.
Ketika Anda menggunakan perintah COMMIT
atau END TRANSACTION
, semua perubahan yang dilakukan pada database sejak perintah COMMIT
atau ROLLBACK
terakhir akan disimpan.
COMMIT;
atau
END TRANSACTION;
Perintah ROLLBACK
Terkadang, Anda mungkin perlu membatalkan transaksi karena adanya kesalahan atau alasan lain. Dalam hal tersebut, perintah ROLLBACK
berguna. Perintah ini akan membatalkan semua perubahan yang dilakukan oleh transaksi yang belum disimpan ke dalam database.
Perintah ROLLBACK
hanya akan membatalkan transaksi sejak perintah COMMIT
atau ROLLBACK
terakhir diterbitkan.
ROLLBACK;
Batasan Pengendalian Transaksi
Meskipun perintah pengendalian transaksi di PostgreSQL menawarkan kontrol yang luas terhadap transaksi database Anda, mereka juga memiliki batasan-batasan tertentu.
Yang paling mencolok adalah perintah pengendalian transaksi hanya dapat digunakan dengan perintah bahasa manipulasi data (DML) seperti INSERT
, UPDATE
, dan DELETE
. Mereka tidak berlaku saat menjalankan perintah bahasa definisi data (DDL) seperti CREATE TABLE
atau DROP TABLE
. Alasannya adalah bahwa di PostgreSQL, perintah DDL secara otomatis di-commit, yang berarti mereka tidak dapat di-rollback.
Contoh Demonstrasi
Misalkan kita memiliki tabel COMPANY
dengan catatan berikut:
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
ROLLBACK
Sekarang, mari kita mulai sebuah transaksi dan hapus catatan dari tabel yang memiliki age = 25
. Kemudian, kita akan menggunakan perintah ROLLBACK
untuk membatalkan semua perubahan.
postgres=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;
Jika Anda memeriksa tabel COMPANY
lagi, Anda akan menemukan bahwa masih berisi catatan-catatan berikut:
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
Hal ini terjadi karena kita telah membatalkan (rollback) transaksi, efektif mengembalikan operasi penghapusan yang kita lakukan sebelumnya.
COMMIT
Sekarang, mari kita mulai transaksi lain, hapus catatan dari tabel yang memiliki age = 25
lagi, tetapi kali ini kita menggunakan perintah COMMIT
untuk menyimpan semua perubahan.
postgres=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;
Setelah memeriksa tabel COMPANY
lagi, Anda akan melihat catatan-catatan berikut:
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(5 rows)
Referensi