Persediaan Temu Duga Pengaturcaraan · Pelajaran

Kebuntuan, Penguncian dan MVCC

Cara pangkalan data mengelakkan konflik serta pertukaran antara penguncian dengan petikan.

Pelajaran 4 daripada 413 langkah

Kebuntuan, Penguncian dan MVCC ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Cara Pangkalan Data Sebenarnya Menguatkuasakan Pengasingan

Tahap pengasingan ialah janji; penguncian dan MVCC ialah mekanisme yang menunaikannya. Penemuduga bertanya tentang perkara ini untuk melihat sama ada anda memahami perkara yang berlaku di sebalik tabir apabila transaksi bertembung.

Terdapat dua strategi utama:

  • Pesimistik (penguncian): menyekat akses yang bercanggah sehingga kunci dilepaskan.
  • Optimistik / MVCC: membenarkan semua pihak membaca syot kilat yang konsisten dan mengesan konflik semasa COMMIT.

Pelajaran ini merangkumi kunci, kebuntuan dan MVCC, serta kompromi antara pendekatan-pendekatan tersebut.

Kunci Dikongsi berbanding Kunci Eksklusif

Penguncian klasik menggunakan dua mod utama:

  • Kunci dikongsi (S) untuk bacaan. Banyak transaksi boleh memegang kunci dikongsi pada baris yang sama serentak.
  • Kunci eksklusif (X) untuk penulisan. Hanya satu transaksi boleh memegangnya, dan kunci ini menyekat semua kunci lain pada baris tersebut.

Peraturannya: S serasi dengan S, tetapi X tidak serasi dengan apa-apa kunci. Transaksi penulis mesti menunggu semua pembaca, dan pembaca mesti menunggu penulis.

Penguncian Eksplisit dengan SELECT FOR UPDATE

Anda boleh meminta kunci tulis pada baris yang hanya dibaca, untuk menghalang pihak lain mengubahnya sebelum anda bertindak. Ini ialah cara piawai untuk mengelakkan kemas kini yang hilang dalam kitaran baca-ubah-tulis.

SELECT ... FOR UPDATE mengambil kunci baris eksklusif; baris itu kekal berkunci sehingga 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

Apakah Kebuntuan?

Kebuntuan berlaku apabila dua atau lebih transaksi masing-masing memegang kunci yang diperlukan oleh pihak lain, lalu membentuk kitaran yang menyebabkan tiada satu pun dapat meneruskan.

Kes buku teks: T1 mengunci baris A kemudian mahukan baris B; T2 mengunci baris B kemudian mahukan baris A. Setiap satu menunggu pihak yang lain tanpa penghujung.

Pangkalan data mengesannya dengan graf menunggu. Apabila kitaran ditemui, enjin memilih mangsa dan membatalkan transaksi itu, lalu mengembalikan ralat kebuntuan supaya transaksi lain dapat meneruskan.

Kebuntuan: Garis Masa

Perhatikan susunan kunci yang bersilang. T1 mengambil kunci pada baris 1 kemudian meminta kunci pada baris 2; T2 mengambil kunci pada baris 2 kemudian meminta kunci pada baris 1. Kedua-duanya tidak melepaskan kunci, jadi enjin membatalkan salah satu daripadanya.

Transaksi yang dibatalkan menerima ralat seperti deadlock detected dan mesti mencuba semula. Transaksi yang terselamat melakukan COMMIT seperti biasa.

-- 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 boleh menghapuskan kebuntuan sepenuhnya, tetapi boleh menjadikannya jarang berlaku. Jawapan temu duga yang piawai:

  • Susunan kunci yang konsisten: sentiasa dapatkan kunci baris dalam susunan yang sama (contohnya, id menaik). Ini memutuskan kitaran.
  • Pastikan transaksi ringkas: pegang kunci sesingkat mungkin.
  • Rendahkan pengasingan apabila selamat: lebih sedikit kunci, lebih sedikit konflik.
  • Tambah logik cubaan semula: mangsa kebuntuan patut mencuba semula secara automatik.

Susunan yang konsisten ialah pembetulan paling berkesan dan perkara pertama yang ingin didengar oleh penemuduga.

Tahap Kehalusan Kunci

Kunci boleh diambil pada skop yang berbeza, sebagai pertukaran antara keserentakan dan kos tambahan:

  • Kunci peringkat baris membenarkan keserentakan tinggi tetapi lebih mahal untuk diurus.
  • Kunci peringkat halaman atau jadual lebih murah untuk dijejaki tetapi menyekat lebih banyak transaksi.

Sesetengah enjin menaik taraf kunci baris kepada kunci jadual apabila transaksi menyentuh terlalu banyak baris (peningkatan tahap kunci). Memahami perkara ini menjelaskan mengapa UPDATE pukal yang besar boleh tiba-tiba menyekat semua pihak.

MVCC: Pendekatan Syot Kilat

MVCC (Kawalan Keserentakan Berbilang Versi) ialah cara Postgres, Oracle dan InnoDB mengelakkan kebanyakan kunci baca. Daripada mengunci, pangkalan data menyimpan berbilang versi bagi setiap baris.

Manfaat utama, dan ungkapan kegemaran dalam temu duga: pembaca tidak menyekat penulis, dan penulis tidak menyekat pembaca.

Setiap transaksi melihat syot kilat yang konsisten pada suatu titik masa, manakala penulis mencipta versi baris baharu dan bukannya menulis ganti di tempat asal.

Cara MVCC Berfungsi di Sebalik Tabir

Apabila baris dikemas kini, MVCC menulis versi baharu dan mengekalkan versi lama. Setiap versi membawa maklumat ID transaksi (dalam Postgres, xmin dan xmax) yang menandakan masa versi itu menjadi kelihatan dan masa ia digantikan.

Syot kilat transaksi menentukan versi yang dilihatnya. Versi lama yang tidak lagi boleh dilihat oleh mana-mana transaksi menjadi tupel mati, lalu dikumpulkan semula kemudian oleh proses pembersihan. Dalam Postgres, proses itu ialah VACUUM; tidak menjalankannya menyebabkan pembengkakan jadual, iaitu soalan susulan yang biasa ditanya.

Penguncian berbanding MVCC: Pertukaran yang Terlibat

Ringkaskan perbandingan ini dengan jelas:

  • Penguncian tulen: ketepatan mudah dicapai, tetapi pembaca dan penulis saling menyekat, lalu menjejaskan keserentakan.
  • MVCC: keserentakan bacaan yang sangat baik dan tiada kunci baca, tetapi menanggung kos penyimpanan versi dan pembersihan (VACUUM, pembengkakan), serta masih memerlukan kunci untuk konflik penulisan sesama penulisan.

Enjin MVCC pun menggunakan kunci semasa penulisan: dua transaksi yang mengemas kini baris yang sama mesti dilaksanakan secara bersiri. MVCC menghapuskan persaingan pembaca-penulis, bukan persaingan penulis-penulis.

Penguncian Optimistik dan Lajur Versi

Selain MVCC pada peringkat enjin, aplikasi sering menambah penguncian optimistik untuk kitaran baca-ubah-tulis sepanjang sesi pengguna yang panjang. Anda menambah lajur version, membacanya, dan semasa mengemas kini, mewajibkan versi itu sepadan lalu menaikkannya.

Jika transaksi lain mengemas kini baris itu terlebih dahulu, versi tersebut tidak lagi sepadan, sifar baris terjejas, dan kod anda tahu bahawa data perlu dimuatkan semula serta dicuba lagi. Tiada kunci dipegang semasa pengguna berfikir, jadi keserentakan kekal tinggi. Penemuduga menyukai pendekatan ini untuk soalan "bagaimanakah anda mengendalikan dua pengguna yang menyunting rekod 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

Semakan Pantas

Uji frasa utama MVCC.

Imbas Kembali: Kunci, Kebuntuan dan MVCC

Kini anda boleh menerangkan mekanisme di sebalik pengasingan:

  • Kunci dikongsi/eksklusif menyelaraskan akses; SELECT FOR UPDATE mengambil kunci tulis eksplisit.
  • Kebuntuan ialah kitaran kunci; enjin membatalkan mangsa, dan susunan kunci yang konsisten mencegah kebanyakannya.
  • MVCC mengekalkan versi baris supaya pembaca dan penulis tidak saling menyekat, dengan kos pembersihan (VACUUM, pembengkakan).

Gabungkan mekanisme ini dengan tahap pengasingan dan anomali daripada pelajaran terdahulu, maka anda boleh menjawab temu duga keserentakan sepenuhnya dari awal hingga akhir.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Kebuntuan, Penguncian dan MVCC” percuma?

Ya — teks penuh “Kebuntuan, Penguncian dan MVCC” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Kebuntuan, Penguncian dan MVCC”?

Cara pangkalan data mengelakkan konflik serta pertukaran antara penguncian dengan petikan. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Kebuntuan, Penguncian dan MVCC” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Sifat ACID Diterangkan
  2. Empat Tahap Pengasingan
  3. Bacaan Kotor, Tidak Boleh Diulang dan Hantu
  4. Kebuntuan, Penguncian dan MVCC
← Kembali ke Persediaan Temu Duga Pengaturcaraan