Pada materi kali ini, kita akan melanjutkan seri dari Tutorial PostgreSQL. Setelah sebelumnya kita membahas Implementasi DCL, sekarang kita akan masuk ke materi terakhir tentang Implementasi TCL atau Transaction Control Languange.
Catatan : Temen-temen bisa membaca sekilas tentang TCL pada materi berikut.
Apa Itu Transaksi?
Transaksi adalah satu set operasi database yang dieksekusi sebagai satu unit kerja. Transaksi di PostgreSQL bersifat Atomicity, Consistency, Isolation, dan Durability (ACID). Yang artinya, semua operasi dalam transaksi akan disimpan secara permanen jika transaksi berhasil. Namun, jika terjadi satu kegagalan, semua operasi yang telah disimpan akan dibatalkan (rollback).
Contoh penggunaan transaksi biasanya dapat ditemukan pada proses transfer bank. Misalnya, teman-teman ingin melakukan transfer dari rekening X ke rekening Y. Namun, saat transfer sedang berlangsung, terjadi suatu error.
Dengan menggunakan transaksi, transfer dari rekening X ke rekening Y dapat langsung dibatalkan, dan data transfer tersebut akan dihapus dari database.
Perintah TCL
1. COMMIT : Untuk menyimpan semua perubahan
2. ROLLBACK : Untuk membatalkan semua perubahan
3. SAVEPOINT : Untuk membuat "checkpoint", jika terjadi kesalahan kita bisa melakukan rollback ke checkpoint tertentu.
- Preview data users, stores dan products
- Data users
- Data stores
- Data products
- Struktur tabel orders dan order_details
- Tabel orders
- Tabel order_detailsCREATE TABLE order_details (id SERIAL PRIMARY KEY,order_id INT REFERENCES orders(id) ON DELETE CASCADE,product_id INT,product_name VARCHAR(191) NOT NULL,quantity INT NOT NULL CHECK (quantity > 0),price DECIMAL(10, 2) NOT NULL,total_price DECIMAL(10, 2) GENERATED ALWAYS AS (quantity * price) STORED,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Catatan : Pada kolom total_price, kita menggunakan sintaks SQL GENERATED ALWAYS untuk mendefinisikan kolom terhitung pada tabel. Selanjutnya, kita menggunakan kata kunci STORED agar nilai yang telah dihitung disimpan secara fisik dan permanen di dalam tabel.
Karena menggunakan GENERATED ALWAYS kolom total_price bersifat (read-only) atau tidak bisa dirubah secara langsung oleh pengguna, jadi nilai total_price akan berubah otomatis ketika ada perubahan pada kolom qty dan harga. - Insert data ke tabel orders dan order_details tanpa Transaksi
Disini kita akan coba melakukan insert data dengan user_id=3 (Budi), store_id=2 (Tech Id Bandung) dan product_id dari tabel products yang dimiliki oleh store_id=2.
Pada query diatas, temen-temen bisa melihat kita telah berhasil melakukan Insert data kedalam tabel orders dan order_details.
Tabel orders:
Tabel order_details :
Sekilas dua query tersebut mungkin sudah cukup untuk melakukan Insert ke dalam dua tabel. Namun, gimana jika ada ketidak sesuaian data saat melakukan Insert ke tabel order_details?
Pada query diatas terdapat error pada saat Insert data ke tabel order_details, error tersebut disebabkan karena qty harus bernilai postif.
Walau terjadi error, data orders tetap disimpan meskipun tidak memiliki daftar produk pada tabel order_details.
Tabel orders :
Tabel order_details :
Kasus seperti ini tentu tidak kita inginkan, karena kegagalan yang menyebabkan data tidak tersimpan secara sempurna di database dapat memengaruhi konsistensi data. Nah, untuk mengatasi hal ini kita bisa menggunakan fitur Transaksi yang disediakan oleh PostgreSQL. - Insert data ke tabel orders dan order_details dengan Transaksi
Catatan : Gunakan operasi BEGIN untuk memulai sebuah transaksi. - COMMIT
Data orders :
Data order_details : - ROLLBACK
Karena menggunakan ROLLBACK, meskipun semua operasi berhasil dilakukan tanpa error, data tetap tidak akan disimpan di database.
Data orders :
Data order_details : - SAVEPOINT
Catatan : Disini kita menggunakan RETURNING untuk mengembalikan nilai id dari data yang sedang kita simpan.
Data orders :
Data order_details :
Temen-temen bisa perhatikan, data yang disimpan pada database hanya data yang ada di SAVEPOINT order1.
Dengan menggunakan transaksi dan error handling (try-catch), kode di dalam blok try akan dieksekusi terlebih dahulu. Jika terjadi kegagalan, eksekusi akan otomatis dialihkan ke blok catch. Di dalam blok catch, kita akan melakukan rollback untuk membatalkan data yang sebelumnya telah berhasil disimpan.
Sebagai seorang programmer profesional dengan pengalaman sekitar 4 tahun di bidang IT, saya siap membantu Anda dengan berbagai kebutuhan konsultasi.
Jangan ragu untuk menghubungi saya melalui WhatsApp.
Sampai jumpa di tutorial berikutnya!
Kontak Saya :
Email : ronisurya.115@gmail.com
WhatsApp : 081222821596
Website : Roni Surya
Materi Sebelumnya : Implementasi DCL