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 📝
- Atomicity: Semua operasi berhasil atau tidak sama sekali
- Consistency: Database tetap konsisten sebelum dan sesudah transaksi
- Isolation: Transaksi tidak saling mengganggu
- 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 📊
READ UNCOMMITTED
- Bisa baca data yang belum di-commit
- Paling cepat tapi tidak aman
READ COMMITTED
- Hanya baca data yang sudah di-commit
- Default di banyak database
REPEATABLE READ
- Jamin data yang dibaca tidak berubah
- Default di MySQL
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 💡
Best Practices
- Transaksi sependek mungkin
- Handle semua error case
- Gunakan timeout yang tepat
Error Handling
-- Contoh error handling START TRANSACTION; BEGIN TRY -- operasi database COMMIT; END TRY BEGIN CATCH ROLLBACK; -- log error END CATCH;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! 🚀