database, sql,

Apa Itu WITH (NOLOCK) pada SQL Server dan Kapan Harus Menggunakannya?

Kiki/🎮🍉⌨️🍩💻 Kiki/🎮🍉⌨️🍩💻 Jul 26, 2026 · 4 mins read
Apa Itu WITH (NOLOCK) pada SQL Server dan Kapan Harus Menggunakannya?
Share this

Dalam dunia pengembang aplikasi dan administrator basis data (Database Administrator / DBA) yang bekerja dengan Microsoft SQL Server, istilah WITH (NOLOCK) sangat sering didengar. Banyak pengembang yang menambahkan WITH (NOLOCK) pada setiap query SELECT dengan alasan ingin membuat query berjalan lebih cepat dan menghindari kekuncian (locking).

Namun, apakah menggunakan WITH (NOLOCK) adalah praktik yang aman? Apa sebenarnya efek samping di balik peningkatan performa tersebut? Artikel ini akan mengupas secara mendalam cara kerja WITH (NOLOCK), bahaya yang tersembunyi, serta alternatif yang lebih aman.


1. Apa Itu WITH (NOLOCK)?

WITH (NOLOCK) adalah sebuah Query Hint di SQL Server yang memerintahkan database engine untuk membaca data tanpa meminta Shared Lock (S-Lock). Secara fungsional, menggunakan WITH (NOLOCK) pada query setara dengan mengubah tingkat isolasi transaksi (Transaction Isolation Level) menjadi READ UNCOMMITTED.

Secara default, SQL Server berjalan pada isolasi READ COMMITTED. Pada tingkat ini, ketika ada proses pembacaan data (SELECT), SQL Server akan meminta Shared Lock untuk memastikan bahwa data yang dibaca sudah selesai ditulisi (committed) oleh transaksi lain. Jika ada transaksi penulisan (UPDATE, INSERT, DELETE) yang sedang berlangsung, transaksi tersebut memegang Exclusive Lock (X-Lock), sehingga query SELECT harus menunggu (block) hingga transaksi penulisan selesai.

Dengan menambahkan WITH (NOLOCK), query SELECT akan mengabaikan kuncian tersebut dan langsung membaca data yang ada di disk atau memori saat itu juga.

-- Contoh penggunaan WITH (NOLOCK)
SELECT Id, NamaPengguna, Saldo
FROM Users WITH (NOLOCK)
WHERE Status = 'Active';

2. Keuntungan Menggunakan WITH (NOLOCK)

Alasan utama pengembang menyukai hint ini adalah:

  1. Mencegah Blocking: Query SELECT tidak akan terhalang oleh transaksi UPDATE atau INSERT yang sedang berjalan lama.
  2. Meningkatkan Throughput Pembacaan: Pada sistem dengan lalu lintas baca yang sangat tinggi, query tidak perlu menunggu antrean kuncian (lock wait time).
  3. Mengurangi Risiko Deadlock: Karena tidak meminta Shared Lock, query baca tidak akan terlibat dalam skenario deadlock pembacaan.

3. Bahaya dan Risiko WITH (NOLOCK)

Meskipun terlihat menjanjikan, WITH (NOLOCK) memiliki risiko besar yang sering diabaikan. Ketika Anda membaca data tanpa kuncian, Anda membuka pintu bagi berbagai masalah konsistensi data:

A. Dirty Reads (Pembacaan Data Kotor)

Dirty Read terjadi ketika query membaca data yang sedang diubah oleh transaksi lain, namun transaksi tersebut kemudian mengalami ROLLBACK.

Skenario:

  1. Transaksi A mengubah saldo pengguna dari Rp 1.000.000 menjadi Rp 5.000.000 (belum di-commit).
  2. Query B membaca saldo menggunakan WITH (NOLOCK) dan mendapatkan nilai Rp 5.000.000.
  3. Transaksi A mengalami error dan melakukan ROLLBACK. Saldo asli kembali ke Rp 1.000.000.
  4. Hasilnya: Query B memproses data Rp 5.000.000 yang sebenarnya tidak pernah ada secara sah di database.

B. Non-Repeatable Reads & Phantom Reads

Data yang Anda baca bisa berubah atau bertambah di tengah-tengah pembacaan. Jika query membaca ribuan baris, baris ke-100 dan baris ke-500 bisa berasal dari status transaksi yang berbeda.

C. Missing Rows atau Duplicate Rows (Index Page Splits)

Ini adalah risiko yang paling berbahaya. Ketika tabel sedang mengalami proses INSERT atau UPDATE yang intensif, SQL Server mungkin perlu membagi halaman indeks (Page Split). Jika query WITH (NOLOCK) sedang menelusuri (scanning) indeks saat Page Split terjadi:

  • Query bisa melewati (skip) baris data tertentu (data tidak terbaca sama sekali).
  • Query bisa membaca baris data yang sama sebanyak dua kali (data terduplikasi).

4. Kapan Boleh dan TIDAK Boleh Menggunakan WITH (NOLOCK)?

❌ KAPAN TIDAK BOLEH MENGGUNAKAN:

  • Sistem Keuangan & Transaksi: Pemrosesan saldo, pembayaran, atau transfer dana.
  • Manajemen Inventaris / Stok: Mengecek ketersediaan barang sebelum checkout.
  • Laporan Resmi / Pelaporan Keuangan: Laporan audit yang membutuhkan angka presisi 100%.
  • Proses Keputusan Bisnis Kritis: Setiap logika sistem yang mengambil keputusan berdasarkan nilai data aktual.

✅ KAPAN BOLEH MENGGUNAKAN:

  • Analisis Data Non-Kritis: Query statistik umum, seperti perkiraan jumlah pengunjung atau estimasi agregasi kasar.
  • Tabel Log / Audit: Membaca tabel log historis yang bersifat append-only (hanya di-insert, tidak pernah di-update atau di-delete).
  • Tabel Referensi Statis: Tabel master yang jarang berubah (misalnya daftar provinsi/kota).

5. Alternatif yang Lebih Aman: READ_COMMITTED_SNAPSHOT (RCSI)

Jika Anda menghadapi masalah blocking antara query baca dan tulis di SQL Server, alih-alih memasang WITH (NOLOCK) di mana-mana, solusi terbaik dan modern adalah mengaktifkan RCSI (Read Committed Snapshot Isolation).

Dengan RCSI, ketika transaksi penulisan sedang berlangsung, SQL Server akan menyimpan versi data lama (committed version) di tempdb. Query SELECT akan membaca versi data terakhir yang sudah di-commit tanpa terhalang transaksi penulisan dan tanpa mengalami dirty read.

Cara mengaktifkan RCSI pada database:

ALTER DATABASE NamaDatabase
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;

Kesimpulan

WITH (NOLOCK) bukanlah tombol ajaib untuk mempercepat query tanpa dampak. Menggunakannya secara sembarangan dapat menyebabkan bug data siluman (silent data corruption) yang sangat sulit dilacak. Gunakan WITH (NOLOCK) hanya pada skenario di mana ketepatan data tidak bersifat kritis, dan pertimbangkan untuk mengadopsi RCSI sebagai solusi permanen untuk performa pembacaan database Anda.

Kiki/🎮🍉⌨️🍩💻
Written by Kiki/🎮🍉⌨️🍩💻
hello I'm friend K.