0Pricing
Coding Interview Prep · Pelajaran

Deadlock, Penguncian, dan MVCC

Cara basis data menghindari konflik serta kompromi antara penguncian dan snapshot.

Deadlock, Penguncian, dan MVCC adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Cara Basis Data Sebenarnya Menerapkan Isolasi

Tingkat isolasi adalah janji; penguncian dan MVCC adalah mekanisme yang mewujudkannya. Pewawancara menanyakan hal ini untuk melihat apakah Anda memahami apa yang terjadi di balik layar ketika transaksi saling bertabrakan.

Ada dua strategi umum:

  • Pesimistis (penguncian): memblokir akses yang berkonflik sampai kunci dilepas.
  • Optimistis / MVCC: mengizinkan semua pihak membaca cuplikan yang konsisten dan mendeteksi konflik saat COMMIT.

Pelajaran ini membahas kunci, kebuntuan, dan MVCC, serta kompromi di antara semuanya.

Kunci Bersama vs Eksklusif

Penguncian klasik menggunakan dua mode utama:

  • Kunci bersama (S) untuk pembacaan. Banyak transaksi dapat memegang kunci bersama pada baris yang sama sekaligus.
  • Kunci eksklusif (X) untuk penulisan. Hanya satu transaksi yang dapat memegangnya, dan kunci ini memblokir semua kunci lain pada baris tersebut.

Aturannya: S kompatibel dengan S, tetapi X tidak kompatibel dengan apa pun. Penulis harus menunggu semua pembaca, dan pembaca harus menunggu penulis.

Penguncian Eksplisit dengan SELECT FOR UPDATE

Anda dapat meminta kunci penulisan pada baris yang hanya Anda baca, untuk mencegah pihak lain mengubahnya sebelum Anda bertindak. Ini adalah cara standar untuk menghindari pembaruan yang hilang dalam siklus baca-ubah-tulis.

SELECT ... FOR UPDATE mengambil kunci baris eksklusif; baris tersebut tetap terkunci sampai Anda melakukan COMMIT atau ROLLBACK.

BEGIN;
-- lock the row so no one else can modify it concurrently
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;  -- lock released here

Apa Itu Kebuntuan

Kebuntuan terjadi ketika dua atau lebih transaksi masing-masing memegang kunci yang dibutuhkan transaksi lain, sehingga membentuk siklus yang membuat tidak satu pun dapat melanjutkan.

Kasus klasiknya: T1 mengunci baris A lalu menginginkan baris B; T2 mengunci baris B lalu menginginkan baris A. Masing-masing menunggu yang lain tanpa batas.

Basis data mendeteksi hal ini dengan grafik tunggu. Ketika siklus ditemukan, mesin memilih korban dan membatalkannya, lalu mengembalikan kesalahan kebuntuan agar transaksi lain dapat melanjutkan.

Kebuntuan: Linimasa

Perhatikan urutan kunci yang saling menyilang. T1 mengambil kunci baris 1 lalu meminta baris 2; T2 mengambil kunci baris 2 lalu meminta baris 1. Tidak ada yang melepaskan kuncinya, sehingga mesin membatalkan salah satunya.

Transaksi yang dibatalkan melihat kesalahan seperti deadlock detected dan harus mencoba lagi. Transaksi yang bertahan melakukan COMMIT secara normal.

-- T1                                  | -- T2
BEGIN;                                 | BEGIN;
UPDATE accounts SET balance=balance-10  | UPDATE accounts SET balance=balance-10
  WHERE id=1;  -- locks row 1          |   WHERE id=2;  -- locks row 2
UPDATE accounts SET balance=balance+10  | UPDATE accounts SET balance=balance+10
  WHERE id=2;  -- waits for T2         |   WHERE id=1;  -- waits for T1 -> CYCLE
-- one transaction is chosen as victim and rolled back

Mencegah Kebuntuan

Anda tidak dapat menghilangkan kebuntuan sepenuhnya, tetapi dapat membuatnya jarang terjadi. Jawaban wawancara standar:

  • Urutan penguncian yang konsisten: selalu dapatkan kunci baris dalam urutan yang sama (misalnya, id menaik). Ini memutus siklus.
  • Jaga transaksi tetap singkat: tahan kunci sesingkat mungkin.
  • Turunkan isolasi jika aman: lebih sedikit kunci berarti lebih sedikit konflik.
  • Tambahkan logika percobaan ulang: korban kebuntuan harus otomatis mencoba lagi.

Urutan yang konsisten adalah perbaikan tunggal yang paling efektif dan hal pertama yang ingin didengar pewawancara.

Granularitas Kunci

Kunci dapat diambil pada cakupan yang berbeda, sebagai kompromi antara konkurensi dan biaya tambahan:

  • Kunci tingkat baris memungkinkan konkurensi tinggi tetapi membutuhkan biaya pengelolaan lebih besar.
  • Kunci halaman atau tabel lebih ringan untuk dilacak tetapi memblokir lebih banyak transaksi.

Beberapa mesin meningkatkan cakupan dari kunci baris ke kunci tabel ketika transaksi menyentuh terlalu banyak baris (eskalasi kunci). Mengetahui hal ini menjelaskan mengapa UPDATE massal besar dapat tiba-tiba memblokir semua orang.

MVCC: Pendekatan Cuplikan

MVCC (Kontrol Konkurensi Multi-Versi) adalah cara Postgres, Oracle, dan InnoDB menghindari sebagian besar kunci pembacaan. Alih-alih mengunci, basis data menyimpan beberapa versi setiap baris.

Manfaat utamanya, dan kalimat andalan dalam wawancara: pembaca tidak memblokir penulis, dan penulis tidak memblokir pembaca.

Setiap transaksi melihat cuplikan yang konsisten pada suatu titik waktu, sementara penulis membuat versi baris baru, bukan menimpa di tempat.

Cara Kerja MVCC di Balik Layar

Saat sebuah baris diperbarui, MVCC menulis versi baru dan mempertahankan versi lama. Setiap versi membawa metadata id-transaksi (di Postgres, xmin dan xmax) yang menandai kapan versi itu terlihat dan kapan digantikan.

Cuplikan transaksi menentukan versi yang dilihatnya. Versi lama yang tidak lagi dapat dilihat oleh transaksi mana pun menjadi tuple mati, yang kemudian diambil kembali oleh proses pembersihan. Di Postgres, proses itu adalah VACUUM; tidak menjalankannya menyebabkan penggelembungan tabel, pertanyaan lanjutan yang umum.

Penguncian vs MVCC: Komprominya

Rangkum perbandingannya secara ringkas:

  • Penguncian murni: ketepatan yang sederhana, tetapi pembaca dan penulis saling memblokir sehingga mengurangi konkurensi.
  • MVCC: konkurensi pembacaan sangat baik, tanpa kunci pembacaan, tetapi harus membayar dengan penyimpanan versi dan pembersihan (VACUUM, penggelembungan), serta tetap memerlukan kunci untuk konflik penulisan dengan penulisan.

Bahkan mesin MVCC menggunakan kunci saat menulis: dua transaksi yang memperbarui baris yang sama harus dijalankan secara berurutan. MVCC menghilangkan pertentangan pembaca-penulis, bukan pertentangan penulis-penulis.

Penguncian Optimistis dan Kolom Versi

Di luar MVCC tingkat mesin, aplikasi sering menambahkan penguncian optimistis untuk operasi baca-ubah-tulis selama sesi pengguna yang panjang. Anda menambahkan kolom version, membacanya, lalu saat melakukan pembaruan mensyaratkan versinya cocok dan menaikkannya.

Jika transaksi lain memperbarui baris itu lebih dahulu, versi tersebut tidak lagi cocok, tidak ada baris yang terpengaruh, dan kode Anda tahu bahwa data harus dimuat ulang lalu dicoba lagi. Tidak ada kunci yang ditahan saat pengguna berpikir, sehingga konkurensi tetap tinggi. Pewawancara menyukai pendekatan ini untuk pertanyaan "bagaimana Anda menangani dua pengguna yang mengedit rekaman yang sama?".

-- read: SELECT id, data, version FROM items WHERE id = 1;  -- version = 7
UPDATE items
  SET data = 'new value', version = version + 1
  WHERE id = 1 AND version = 7;
-- if rows affected = 0, someone else changed it: reload and retry

Pemeriksaan Singkat

Uji kalimat andalan inti MVCC.

Ringkasan: Kunci, Kebuntuan, dan MVCC

Sekarang Anda dapat menjelaskan mekanisme di balik isolasi:

  • Kunci bersama/eksklusif mengoordinasikan akses; SELECT FOR UPDATE mengambil kunci penulisan eksplisit.
  • Kebuntuan adalah siklus kunci; mesin membatalkan korban, dan urutan penguncian yang konsisten mencegah sebagian besar kebuntuan.
  • MVCC mempertahankan versi baris agar pembaca dan penulis tidak saling memblokir, dengan biaya pembersihan (VACUUM, penggelembungan).

Padukan mekanisme ini dengan tingkat isolasi dan anomali dari pelajaran sebelumnya, maka Anda dapat menjalani wawancara konkurensi secara menyeluruh dari awal hingga akhir.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Deadlock, Penguncian, dan MVCC” gratis?

Ya — teks lengkap “Deadlock, Penguncian, dan MVCC” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Deadlock, Penguncian, dan MVCC”?

Cara basis data menghindari konflik serta kompromi antara penguncian dan snapshot. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Deadlock, Penguncian, dan MVCC” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menjelaskan Properti ACID
  2. Empat Tingkat Isolasi
  3. Pembacaan Kotor, Tidak Berulang, dan Hantu
  4. Deadlock, Penguncian, dan MVCC
← Kembali ke Coding Interview Prep