Transaction Management: Mengelola Transaksi Database 🔄

Halo SQL Explorers! 👋 Setelah belajar Views dan Indexes, sekarang kita bakal belajar tentang Transaction Management. Ini penting untuk menjaga konsistensi data!

Apa itu Transaction? 🤔

Transaction adalah serangkaian operasi database yang diperlakukan sebagai satu unit kerja. Semua operasi harus berhasil, atau semuanya dibatalkan (rollback).

ACID Properties 📝

  1. Atomicity: Semua operasi berhasil atau tidak sama sekali
  2. Consistency: Database tetap konsisten sebelum dan sesudah transaksi
  3. Isolation: Transaksi tidak saling mengganggu
  4. Durability: Data yang sudah di-commit permanen

Basic Transaction 🔄

-- Contoh transaksi sederhana
START TRANSACTION;

-- Update stok produk
UPDATE products 
SET stok = stok - 1
WHERE id = 1;  -- Laptop Gaming

-- Insert order baru
INSERT INTO orders (customer_id, tanggal, status)
VALUES (1, NOW(), 'pending');  -- Order dari Budi

-- Insert order items
INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES (LAST_INSERT_ID(), 1, 1, 15000000);

-- Commit jika semua berhasil
COMMIT;

-- Atau rollback jika ada error
-- ROLLBACK;

Transaction dengan Error Handling 🛡️

-- Transaksi dengan validasi stok
START TRANSACTION;

-- Cek stok dulu
SELECT @stok := stok FROM products WHERE id = 2;  -- Smartphone

IF @stok >= 1 THEN
    -- Update stok
    UPDATE products 
    SET stok = stok - 1
    WHERE id = 2;
    
    -- Insert order
    INSERT INTO orders (customer_id, tanggal, status)
    VALUES (2, NOW(), 'pending');  -- Order dari Ani
    
    -- Insert order items
    INSERT INTO order_items (order_id, product_id, quantity, price)
    VALUES (LAST_INSERT_ID(), 2, 1, 5000000);
    
    COMMIT;
ELSE
    ROLLBACK;
    SELECT 'Stok tidak cukup' as error_message;
END IF;

Transaction Isolation Levels 🔒

-- Set isolation level
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- Contoh transaksi dengan isolation level
START TRANSACTION;

-- Baca data current
SELECT * FROM products WHERE id = 1;

-- Tunggu beberapa saat
-- Data mungkin berubah oleh transaksi lain

-- Baca data lagi
SELECT * FROM products WHERE id = 1;

COMMIT;

Isolation Levels yang Tersedia 📊

  1. READ UNCOMMITTED

    • Bisa baca data yang belum di-commit
    • Paling cepat tapi tidak aman
  2. READ COMMITTED

    • Hanya baca data yang sudah di-commit
    • Default di banyak database
  3. REPEATABLE READ

    • Jamin data yang dibaca tidak berubah
    • Default di MySQL
  4. SERIALIZABLE

    • Paling aman tapi paling lambat
    • Transaksi dijalankan satu per satu

Contoh Kasus: Order Processing 🛒

-- Function untuk proses order
DELIMITER //

CREATE PROCEDURE process_order(
    IN p_customer_id INT,
    IN p_product_id INT,
    IN p_quantity INT
)
BEGIN
    DECLARE v_price DECIMAL(15,2);
    DECLARE v_stok INT;
    DECLARE v_order_id INT;
    
    -- Start transaction
    START TRANSACTION;
    
    -- Get product info
    SELECT harga, stok 
    INTO v_price, v_stok
    FROM products 
    WHERE id = p_product_id;
    
    -- Check stock
    IF v_stok >= p_quantity THEN
        -- Update stock
        UPDATE products 
        SET stok = stok - p_quantity
        WHERE id = p_product_id;
        
        -- Create order
        INSERT INTO orders (customer_id, tanggal, status)
        VALUES (p_customer_id, NOW(), 'success');
        
        SET v_order_id = LAST_INSERT_ID();
        
        -- Create order item
        INSERT INTO order_items (order_id, product_id, quantity, price)
        VALUES (v_order_id, p_product_id, p_quantity, v_price);
        
        -- Commit if all successful
        COMMIT;
        
        SELECT 'Order berhasil diproses' as message;
    ELSE
        -- Rollback if not enough stock
        ROLLBACK;
        
        SELECT 'Stok tidak cukup' as message;
    END IF;
END //

DELIMITER ;

-- Menggunakan stored procedure
CALL process_order(1, 1, 1);  -- Budi beli 1 Laptop Gaming

Tips Transaction Management 💡

  1. Best Practices

    • Transaksi sependek mungkin
    • Handle semua error case
    • Gunakan timeout yang tepat
  2. Error Handling

    -- Contoh error handling
    START TRANSACTION;
    
    BEGIN TRY
        -- operasi database
        COMMIT;
    END TRY
    BEGIN CATCH
        ROLLBACK;
        -- log error
    END CATCH;
    
  3. Performance Tips

    • Pilih isolation level yang tepat
    • Hindari transaksi yang terlalu lama
    • Monitor deadlocks

Materi Selanjutnya 📚

Di materi selanjutnya, kita bakal belajar:

  • Database design principles
  • Normalization
  • Relationship types
  • Dan masih banyak lagi! 🚀