Wednesday, February 4, 2026

 Ini salah satu kebiasaan lama yang sering “lolos review”.

Procedure:

  • Jalan normal

  • Tidak error

  • Bahkan terasa aman

Padahal… dampaknya bisa panjang.


Contoh yang Sering Saya Temui

FOR rec IN ( SELECT order_id FROM orders WHERE status = 'NEW' ) LOOP UPDATE orders SET status = 'PROCESS' WHERE order_id = rec.order_id; COMMIT; END LOOP;

Secara logika:

  • Setiap data langsung disimpan

  • Kalau gagal, yang lain sudah aman

Secara sistem:
👉 ini mimpi buruk performa


Kenapa COMMIT di Loop Itu Bermasalah?

Setiap COMMIT:

  • Menulis redo log

  • Melepas undo

  • Sinkron ke disk

Kalau loop:

  • 1.000 baris → 1.000 COMMIT

  • 10.000 baris → 10.000 COMMIT

Tidak heran kalau:

  • I/O naik

  • Session lain melambat

  • Database terasa “berat”

Dan tidak ada error sama sekali.


“Tapi Saya Takut Datanya Setengah Jalan…”

Ini alasan paling sering.

Dan memang valid dalam kasus tertentu.

Tapi sebelum taruh COMMIT di loop, tanyakan dulu:

  1. Apakah datanya benar-benar besar?

  2. Apakah bisa di-rollback bersama?

  3. Apakah failure-nya sering?

Sering kali jawabannya: tidak.


Pola yang Lebih Aman

Kalau memungkinkan:

FOR rec IN ( SELECT order_id FROM orders WHERE status = 'NEW' ) LOOP UPDATE orders SET status = 'PROCESS' WHERE order_id = rec.order_id; END LOOP; COMMIT;

Atau lebih baik lagi:

UPDATE orders SET status = 'PROCESS' WHERE status = 'NEW'; COMMIT;

Satu commit.
Lebih bersih.
Lebih ringan.


Kapan COMMIT di Loop Masih Masuk Akal?

Ada, tapi jarang.

Biasanya kalau:

  • Proses sangat panjang (jam-an)

  • Data independen per baris

  • Failure sebagian masih bisa diterima

Dan itupun:

  • Commit per batch (misalnya tiap 1.000 baris)

  • Bukan setiap baris


Catatan Pengalaman Kerja

Saya pernah menemukan job malam yang:

  • Tidak pernah error

  • Tapi membuat backup melambat

Setelah dicek:

  • Ada COMMIT di loop

  • Data puluhan ribu

Setelah diubah:

  • Commit per batch

  • Waktu eksekusi turun drastis

  • Beban server lebih stabil


Prinsip yang Saya Pegang Sekarang

Kalau lihat:

  • COMMIT di loop
    dan

  • Data bukan kecil

Saya langsung curiga.

Bukan salah,
tapi sering tidak perlu.


Penutup

COMMIT itu penting,
tapi tempatnya juga penting.

PL/SQL bukan cuma soal “jalan atau tidak”,
tapi soal bagaimana dampaknya ke sistem.

Sampai catatan Rabu berikutnya 👋

0 comments:

Post a Comment

Popular Posts