Tutorial PostgreSQL - Transaction

     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.

Implementasi Transaksi
   Supaya temen-temen bisa lebih memahami soal Transaksi, kita akan coba mengimplementasikan pada tabel orders dan tabel order_details.
  1. Preview data users, stores dan products
    1. Data users


    2. Data stores


    3. Data products


  2. Struktur tabel orders dan order_details
    1. Tabel orders



      CREATE TABLE orders (
          id SERIAL PRIMARY KEY,
          user_id INT REFERENCES users(id) ON DELETE RESTRICT,
          store_id INT REFERENCES stores(id) ON DELETE RESTRICT,
          total_amount DECIMAL(10, 2) NOT NULL,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

      ); 

    2. Tabel order_details



      CREATE 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.

  3. 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.

  4. Insert data ke tabel orders dan order_details dengan Transaksi
    Catatan : Gunakan operasi BEGIN untuk memulai sebuah transaksi.

    1. COMMIT


      Data orders : 


      Data order_details :


    2. ROLLBACK


      Karena menggunakan ROLLBACK, meskipun semua operasi berhasil dilakukan tanpa error, data tetap tidak akan disimpan di database.

      Data orders :


      Data order_details :


    3. 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.

Implementasi Transaksi Pada Laravel
    Jika temen-temen menggunakan Laravel, kita bisa menggunakan Transaksi yang di kombinasikan dengan mekanisme error handling.


    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.

    Mungkin itu saja yang bisa kita pelajari pada materi kali ini. Semoga materinya dapat membantu teman-teman memahami tentang Implementasi Perintah TCL. Jika teman-teman memiliki pertanyaan atau ingin berbagi pengalaman, silakan ketikkan pada kolom komentar di bawah.

Sedikit Tentang Saya :

    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

Lebih baru Lebih lama