Topik temu duga representatif

Bagaimanakah Anda Mencegah, Mengesan, dan Memulihkan daripada Kebuntuan (Deadlock)?

UmumSederhana
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Satu perkhidmatan pemindahan wang kadangkala terhenti (freeze): benang A memegang kunci untuk akaun 42 dan menunggu akaun 84, manakala benang B memegang akaun 84 dan menunggu akaun 42. Adakah ini kebuntuan (deadlock)? Terangkan empat syarat perlu dan reka bentuk pencegahan, pengesanan, pemulihan, serta pengesahan.

Gesaan dan Konteks yang Berkenaan

Satu perkhidmatan pemindahan wang kadangkala terhenti (freeze): benang A memegang kunci untuk akaun 42 dan menunggu akaun 84, manakala benang B memegang akaun 84 dan menunggu akaun 42. Tiada satu pun benang yang melepaskan kunci pertamanya. Adakah ini kebuntuan (deadlock)? Terangkan empat syarat perlu dan reka bentuk pencegahan, pengesanan, pemulihan, serta pengesahan.

Ini adalah soalan kejuruteraan perisian dan sistem pengendalian umum untuk peranan backend, sistem, infrastruktur, SRE, dan peranan lain yang menulis kod konkuren. Bahan temu duga 2026 bahasa Inggeris dan bahasa Cina semasa masih bertanya secara berasingan tentang definisi, empat syarat perlu, dan strategi pengendalian. Artikel ini tidak membuat atribusi syarikat dan tidak mendakwa kekerapan temu duga yang tidak disokong.

Akaun 42 dan 84 adalah pengecam rekaan. Tugasan ini menjangkaui sekadar menghafal empat nama syarat tersebut. Jawapan yang mantap membezakan penantian yang lama daripada kitaran penantian yang tidak boleh dipermudahkan, kemudian menghubungkan teori tersebut dengan protokol kunci, bukti masa jalanan, pemulihan kegagalan, dan ujian. Skop utamanya ialah mutex tika tunggal dan kunci baris pangkalan data. Pajakan teragih, pemetakan rangkaian, dan konsensus berada di luar jawapan pertama.

Perkara yang Dinilai oleh Penemu Duga

Isyarat pertama ialah sama ada diagnosis menggunakan hubungan penantian. CPU yang rendah, permintaan yang tamat masa, atau dua benang yang disekat menunjukkan ketiadaan kemajuan tetapi tidak membuktikan kebuntuan secara bebas. Jawapan yang mantap membina graf tunggu-untuk (wait-for graph) yang nodnya ialah benang atau transaksi dan tepinya bermaksud "menunggu sumber yang dimiliki oleh", kemudian mencari kitaran.

Isyarat kedua ialah penggunaan tepat empat syarat perlu: penyingkiran saling (mutual exclusion), pegang dan tunggu (hold and wait), tiada preempsi (no preemption), dan penantian bulat (circular wait). Syarat-syarat ini menerangkan sebab kebuntuan boleh berlaku. Menyenaraikannya tanpa memetakan setiap satu kepada laluan pemindahan wang masih dianggap sebagai respons hafalan.

Isyarat ketiga ialah strategi pencegahan dengan invarian global yang boleh dibuktikan. Pilihan praktikal selalunya merupakan susunan menyeluruh yang stabil (stable total order) untuk setiap kunci, yang dikuatkuasakan merentasi setiap titik masuk. Menukar dua baris dalam satu fungsi adalah tidak mencukupi. Tugas kelompok (batch jobs), bayaran balik, alat pembaikan, dan laluan masa hadapan boleh mencipta semula kitaran tersebut jika ada yang memperoleh kunci dalam susunan terbalik.

Akhir sekali, penemu duga menilai sempadan pemulihan. Pangkalan data boleh mengesan kitaran dan mengundur (roll back) transaksi. Mutex dalam-proses biasanya tidak boleh dirampas dengan selamat dan penyambungan semula pelaksanaan dilakukan kerana kod yang terganggu mungkin hanya mengubah separuh daripada invarian. Jawapan yang mantap memisahkan pencegahan, penghindaran, pengesanan, dan pemulihan, menyatakan kos tamat masa, dan menghasilkan semula jalinan benang (interleaving) dan bukannya berharap ujian tekanan akan menemuinya secara kebetulan.

Soalan untuk Dijelaskan Sebelum Menjawab

  • Adakah semua sumber merupakan mutex tika tunggal? Kitaran dalam graf tunggu-untuk ke atas sumber tika tunggal membuktikan bahawa kumpulan tersebut tidak boleh maju. Jika jenis sumber mempunyai berbilang tika, kitaran dalam graf peruntukan sumber menunjukkan kemungkinan; tika yang tersedia dan baki keperluan masih penting.
  • Adakah kunci bersifat masuk semula (reentrant)? Memperoleh semula kunci bukan masuk semula dalam benang yang sama boleh menyebabkan kebuntuan kendiri. Apabila akaun sumber dan destinasi adalah sama, lakukan penyahduplikasian sebelum mengunci dan bukannya menganggap pengisihan mengendalikan duplikasi tersebut.
  • Adakah kedua-dua perubahan akaun berada dalam satu transaksi yang mampu diundur? Sempadan transaksi boleh melepaskan mangsa dan mencuba semula. Aliran yang telah menghantar pembayaran luaran atau e-mel memerlukan kunci ketakberubahan (idempotency key) atau outbox pasca-komit, bukan memainkan semula secara membuta tuli.
  • Bolehkah setiap laluan pemerolehan berkongsi satu peraturan susunan? Jika ya, utamakan susunan global. Jika komponen pihak ketiga atau sumber rentas perkhidmatan tidak boleh menyertai protokol tersebut, kurangkan pemilikan serentak, reka bentuk semula pemilikan, atau letakkan pengesanan dan pengunduran di sekitar sempadan yang selamat.
  • Berapa lama permintaan boleh menunggu, dan apakah maksud tamat masa? Tamat masa kunci mengehadkan kependaman ekor (tail latency) tetapi boleh menamatkan permintaan perlahan yang sah. Pemanggil perlu tahu sama ada operasi itu boleh dicuba semula, muktamad, atau keputusannya tidak diketahui.
  • Apakah kemudahan diagnostik yang didedahkan oleh masa jalanan? Pengurusan benang JVM, paparan penantian pangkalan data, dan pengesah kunci kernel meliputi kelas kunci yang berbeza. Tiada laporan daripada satu alat tidak membersihkan penantian tak segerak, benang maya, atau sumber luaran.
  • Adakah bahagian genting (critical section) memanggil operasi rangkaian, cakera, atau kawalan pengguna? Kebergantungan tanpa batas memanjangkan pemilikan dan membesarkan penyekatan. Pindahkan ia ke luar melainkan protokol ketekalan secara eksplisit memerlukan penantian dan mengendalikan kegagalannya.

Rangka Kerja Jawapan 30 Saat

"Ini adalah kebuntuan (deadlock): A menunggu B melepaskan 84, manakala B menunggu A melepaskan 42, jadi graf tunggu-untuk mengandungi A → B → A. Kes ini mempunyai penyingkiran saling, pegang dan tunggu, tiada preempsi, dan penantian bulat. Saya akan menyahduplikasi ID akaun dan memperoleh semua kunci akaun dalam satu susunan menaik yang stabil, dan melepaskannya dalam susunan terbalik, yang memecahkan penantian bulat melalui protokol. Dalam pengeluaran, saya akan mengesahkan kitaran daripada data penantian benang atau pangkalan data. Mangsa pangkalan data diundur dan dicuba semula dengan had; untuk kebuntuan dalam-proses, saya mengekalkan diagnostik dan memulihkan hanya pada sempadan keadaan yang selamat. Ujian penghalang (barrier test) menjadikan jalinan lama deterministik dan mengesahkan bahawa versi tersusun mengekalkan invarian baki."

Jawapan yang lengkap harus menambah sebab penyusunan menolak kitaran, sebab tamat masa bukan bukti, penantian yang diliputi oleh pengesan, dan sama ada pemulihan boleh menduplikasi kesan sampingan luaran.

Jawapan Mendalam Langkah demi Langkah

Langkah 1: Buktikan kitaran penantian dan bukannya mendiagnosis daripada simptom

Wakilkan keadaan masa jalanan sebagai graf tunggu-untuk. Benang A memegang kunci 42 dan meminta 84, yang dimiliki oleh B, jadi tambahkan A → B. Benang B memegang 84 dan meminta 42, yang dimiliki oleh A, jadi tambahkan B → A. Setiap benang melepaskan kunci pertamanya hanya selepas memperoleh kunci kedua. Tiada nod dalam kitaran yang boleh selesai terlebih dahulu, jadi kumpulan tersebut tidak boleh membuat kemajuan dengan sendirinya.

Diagnosis pengeluaran memerlukan pemilik, penunggu, dan tindanan (stacks) daripada masa yang hampir sama. Satu snapshot benang mungkin menangkap pertikaian (contention) yang tidak berbahaya. Snapshot berulang dengan tindanan dan tepi yang sama memberikan bukti yang lebih kukuh. Penantian yang lama tetapi biasa tidak mempunyai tepi kembali: A mungkin menunggu B sementara B berjalan dan akhirnya melepaskan sumbernya. Memanggil setiap kunci yang perlahan sebagai kebuntuan adalah salah mendiagnosis kapasiti atau kependaman kebergantungan sebagai pepijat protokol kunci.

Kesimpulan graf mempunyai sempadan model. Apabila setiap mutex mempunyai satu pemilik, kitaran penantian adalah mencukupi untuk membuktikan kebuntuan dalam kalangan benang tersebut. Apabila kategori sumber mempunyai berbilang tika, kitaran dalam graf peruntukan sumber menunjukkan risiko dan bukannya bukti; tika luaran mungkin dilepaskan dan membolehkan peserta meneruskan. Analisis kemudiannya memerlukan permintaan yang tersedia, diperuntukkan, dan baki maksimum.

Langkah 2: Petakan empat syarat perlu kepada kod

Empat syarat tersebut adalah konkrit dalam pemindahan ini:

  1. Penyingkiran saling (Mutual exclusion): satu benang pada satu masa memiliki kunci tulis akaun.
  2. Pegang dan tunggu (Hold and wait): A memegang 42 semasa meminta 84; B memegang 84 semasa meminta 42.
  3. Tiada preempsi (No preemption): masa jalanan tidak mengambil kunci akaun secara selamat daripada pemiliknya; pemilik yang melepaskannya.
  4. Penantian bulat (Circular wait): A menunggu B dan B menunggu A.

Setiap syarat wujud apabila kebuntuan ini berlaku, dan memecahkan mana-mana satu syarat akan menghalang kelas ini. Jangan anggap "sistem menggunakan mutex" atau "kod menindan kunci" sebagai bukti kebuntuan aktif. Syarat perlu menerangkan perkara yang membolehkan kebuntuan; keadaan masa jalanan masih memerlukan kitaran yang tidak boleh dipermudahkan.

Penyingkiran saling mungkin melindungi invarian baki, jadi mengeluarkannya dan berlumba pada keadaan dikongsi bukanlah penyelesaian. Preempsi yang selamat juga sukar untuk bahagian genting dalam-ingatan biasa. Sistem kejuruteraan lebih kerap menghapuskan penantian bulat atau, pada sempadan yang mampu diundur, mengesan dan membatalkan satu transaksi.

Langkah 3: Hapuskan penantian bulat dengan susunan kunci global

Takrifkan susunan menyeluruh untuk setiap kunci yang mungkin dipegang bersama, seperti pangkat jenis sumber diikuti oleh ID sumber. Apabila hanya kunci akaun yang terlibat, susun mengikut ID akaun. Nyahduplikasi terlebih dahulu untuk mengendalikan pemindahan yang sumber dan destinasinya sepadan. Peroleh mengikut susunan, lakukan hanya pengesahan dan mutasi keadaan dalam bahagian genting, dan lepaskan dalam susunan terbalik.

Kod pseudo neutral bahasa:

transfer(fromid, toid, amount): ids = unique(sortascending([fromid, to_id])) acquired = [] try: for id in ids: acquired.append(lock_account(id)) validateandapplytransfer(fromid, to_id, amount) finally: for lock in reverse(acquired): unlock(lock)

Hujah ketepatan adalah ringkas. Jika benang yang memegang kunci berpangkat lebih rendah hanya boleh menunggu kunci berpangkat lebih tinggi, kitaran penantian memerlukan pangkat meningkat secara ketat:

r1 < r2 < … < rn < r1

Susunan yang ketat tidak boleh kembali ke titik permulaannya, jadi penantian bulat adalah mustahil. Bukti bergantung pada setiap laluan yang mematuhi susunan yang sama. Pemerolehan mengikut susunan permintaan, susunan lelaran senarai, atau susunan pulangan pangkalan data pada satu laluan sisi membatalkan invarian tersebut.

Pelepasan terbalik menjadikan pemilikan bersarang mudah difahami tetapi bukan perkara yang menghalang kitaran. Peraturan yang lebih penting adalah untuk mengelakkan panggilan jauh, input pengguna, dan I/O tanpa batas semasa memegang kunci. Bahagian genting yang panjang mungkin tidak mengalami kebuntuan, tetapi ia membesarkan pertikaian, tamat masa, dan kos pemulihan.

Langkah 4: Ketahui bila strategi lain sesuai

Meminta setiap sumber sebelum melakukan kerja memecahkan pegang dan tunggu, tetapi pemanggil mesti mengetahui set lengkap terlebih dahulu. Set yang besar juga memanjangkan pemilikan dan mengurangkan kekonkuran. Ia sesuai untuk set kunci yang kecil dan diketahui, serta kurang sesuai apabila penjelajahan menemui sumber secara berperingkat.

Penghindaran kebuntuan bertanya sama ada meluluskan permintaan mengekalkan keadaan selamat. Algoritma Banker memerlukan permintaan maksimum terlebih dahulu dan menjejaki sumber yang tersedia, maksimum, diperuntukkan, dan baki. Permintaan web dinamik jarang mengetahui setiap objek yang akan disentuhnya kemudian, jadi algoritma ini berguna untuk menerangkan keadaan selamat tetapi biasanya tidak disalin ke dalam kod aplikasi. Keadaan selamat menjamin urutan penyiapan. Keadaan tidak selamat boleh membawa kepada kebuntuan tetapi belum lagi mengalami kebuntuan.

Mengurangkan keadaan boleh ubah yang dikongsi, menetapkan satu pemilik, atau menggunakan bekas konkuren yang matang boleh menghapuskan laluan kunci yang ditulis secara manual. Ia tidak mewajarkan bahawa "mesej tidak boleh mengalami kebuntuan." Dua baris gilir terbatas boleh menunggu kapasiti satu sama lain, dan tugasan dalam satu pelaksana boleh menunggu keputusan secara berkitar. Alternatif ini masih memerlukan graf penantian.

Try-lock dan tamat masa adalah mekanisme pelepasan yang mudah hilang (lossy), bukan bukti protokol tak berkitar. Jika laluan tamat masa mengundur keadaan separa dan melepaskan setiap kunci yang dipegang, ia memecahkan pegang dan tunggu selepas ambang dan meleraikan kitaran ini. Permintaan masih terhenti sebelum ambang, dan ambang yang pendek membatalkan kerja yang sah. Kedua-dua pihak boleh tamat masa dan mencuba semula bersama-sama, menghasilkan kebuntuan hidup (livelock). Gunakan kiraan percubaan maksimum, undur rawak (randomized backoff), semantik idempoten, dan ralat terminal.

Langkah 5: Nyatakan perkara yang sebenarnya diliputi oleh setiap pengesan

ThreadMXBean JVM boleh mencari kitaran dalam kalangan benang platform yang menunggu pemantau objek atau penyegerak yang boleh dimiliki dan mengembalikan ID mereka. Dokumentasi Java SE 25 menyatakan bahawa kitaran yang mengandungi benang maya tidak ditemui oleh kaedah ini dan operasi tersebut adalah untuk penyelesaian masalah, bukan kawalan penyegerakan. Hasil nol hanya membersihkan liputan pengesan tersebut.

lockdep kernel Linux merekodkan kebergantungan pemerolehan yang diperhatikan antara kelas kunci. Jika pelaksanaan mendedahkan L1 → L2 dan L2 → L1, ia boleh melaporkan potensi penyongsangan walaupun larian ini tidak terhenti. Ini menunjukkan cara persekitaran pembangunan dan ujian boleh mengesahkan protokol susunan; kod aplikasi tidak boleh menganggap setiap masa jalanan menawarkan pengesah yang sama.

PostgreSQL secara automatik mengesan kebuntuan transaksi dan membatalkan satu transaksi yang mengambil bahagian supaya transaksi lain boleh diteruskan. Dokumentasinya menyatakan bahawa mangsa sukar diramal, jadi logik perniagaan tidak boleh bergantung pada "permintaan yang lebih baharu sentiasa kalah." PostgreSQL juga mengesyorkan susunan pemerolehan yang konsisten merentasi aplikasi dan mencuba semula transaksi yang dibatalkan apabila pencegahan penuh tidak dapat dilaksanakan.

Isyarat pengeluaran harus merangkumi tempoh menunggu kunci, tempoh memegang kunci, kiraan kebuntuan, transaksi yang diundur, percubaan mencuba semula, dan kegagalan terminal. Rekod diagnostik harus mengaitkan penunggu, pemilik, kelas kunci, dan tindanan tanpa mencatat log data akaun penuh, parameter pertanyaan, atau muatan sensitif.

Langkah 6: Pulihkan pada sempadan ketekalan sumber

Selepas pangkalan data memilih mangsa, undur keseluruhan transaksi, baca semula keadaan, dan laksanakan semula. Jangan sambung semula daripada "selepas kunci pertama." Hadkan percubaan semula dan tambah kelewatan rawak. Jika permintaan pendua boleh tiba, gunakan kunci ketakberubahan perniagaan. Cetuskan e-mel, pemesejan, atau pembayaran luaran selepas komit melalui laluan seperti outbox yang idempoten kerana pengunduran pangkalan data tidak boleh membatalkan kesan sampingan yang telah dikeluarkan.

Apabila benang dalam-proses tersekat pada mutex, menamatkan satu benang secara paksa boleh menyebabkan invarian dalam-ingatan dikemas kini separuh jalan. Laluan pemulihan biasa menangkap pembuangan benang (thread dumps) dan metrik utama, kemudian membiarkan penyeliaan memulakan semula proses atau tika yang keadaannya boleh dibina semula dengan selamat. Jika proses memiliki keadaan unik yang tidak boleh dipulihkan, permulaan semula juga tidak selamat; kegigihan (persistence) dan pemulihan memerlukan reka bentuk semula.

Pemilihan mangsa boleh mempertimbangkan kerja yang telah dilakukan, kos pengunduran, keutamaan, dan sejarah percubaan semula, tetapi ketepatan diutamakan. Pemulihan mengembalikan kemajuan dan tidak menghapuskan punca. Tanpa membetulkan susunan kunci, trafik yang sama boleh mengalami kebuntuan lagi.

Langkah 7: Sahkan pembaikan dengan jalinan deterministik

Jangan hanya bergantung pada ujian kekonkuran tinggi untuk bernasib baik. Tambahkan penghalang ujian (test barrier) pada pelaksanaan lama. A mencapai penghalang selepas mengunci 42, dan B mencapainya selepas mengunci 84. Lepaskan kedua-duanya untuk meminta kunci kedua mereka. Watchdog harus menangkap kedua-dua tepi penantian dalam tarikh akhir ujian, membuktikan A → B → A dan bukannya sekadar mengesan mesin ujian yang perlahan.

Jalankan input terbalik yang sama terhadap pembaikan. A dan B kedua-duanya mencuba ID 42 yang lebih rendah dahulu. Seorang menunggu tanpa memiliki 84; pemenang memperoleh 84, menyelesaikan, dan melepaskan, selepas itu seorang lagi meneruskan. Sahkan bahawa kedua-dua permintaan menerima hasil yang sah mengikut kontrak, jumlah baki kekal tidak berubah, dan tiada pemindahan yang dilaksanakan dua kali.

Lindungi juga:

  • ID sumber dan destinasi yang sama, membuktikan penyahduplikasian mengelakkan pemerolehan kedua bagi kunci bukan masuk semula;
  • tiga atau lebih akaun dan berbilang jenis sumber, membuktikan kunci susunan adalah sama merentasi laluan;
  • baki tidak mencukupi, pengecualian, pembatalan, dan kegagalan pemerolehan separa, membuktikan finally melepaskan setiap kunci yang diperoleh;
  • laluan kelompok, bayaran balik, dan pembaikan yang serentak dengan pemindahan dalam talian, mencari penyongsangan pintasan;
  • pengesanan pangkalan data dan pengunduran mangsa, mengesahkan percubaan semula penuh, kesan sampingan idempoten, dan had percubaan semula;
  • rendaman pertikaian tinggi rawak (randomized high-contention soak) yang sentiasa memeriksa baki, penantian kunci, kebuntuan, dan kebuluran (starvation).

Ujian deterministik menutup contoh balas yang diketahui. Ujian rendaman mencari laluan yang tidak dimodelkan. Kedua-duanya diperlukan sebelum mendakwa bahawa protokol telah disahkan.

Contoh Jawapan Berkualiti Tinggi

"Saya akan membuktikan terlebih dahulu bahawa ini adalah lebih daripada penantian yang perlahan. A memiliki 42 dan menunggu 84 milik B, jadi A → B. B memiliki 84 dan menunggu 42 milik A, jadi B → A. Setiap mutex tika tunggal dilepaskan hanya selepas pemiliknya mendapat yang kedua, menjadikan kitaran ini satu kebuntuan.

Kesemua empat syarat perlu ada: kunci tulis akaun adalah saling menyingkir; kedua-dua benang memegang satu kunci sambil menunggu yang lain; kunci tidak boleh dirampas secara selamat; dan penantian membentuk kitaran. Saya tidak akan mengeluarkan penyingkiran saling kerana ia melindungi baki. Saya akan memecahkan penantian bulat dengan mentakrifkan satu susunan menyeluruh untuk kunci akaun, menyahduplikasi ID, memperoleh dalam susunan menaik, dan melepaskan dalam susunan terbalik. Jika setiap laluan hanya menunggu daripada pangkat yang lebih rendah ke pangkat yang lebih tinggi, kitaran memerlukan pangkat meningkat dan kemudian kembali ke titik permulaan yang lebih rendah, yang mana adalah mustahil.

Peraturan ini mesti meliputi pemindahan dalam talian, bayaran balik, kerja kelompok, dan alat pembaikan. Bahagian genting hanya mengandungi pengesahan dan mutasi keadaan, bukan panggilan jauh. Tamat masa boleh meleraikan penantian ini selepas pelepasan lengkap, tetapi ia tidak membuktikan bahawa protokol kunci adalah tak berkitar. Tamat masa dan percubaan semula serentak boleh menjadi kebuntuan hidup (livelock), jadi mana-mana laluan tamat masa memerlukan percubaan terhad, undur rawak, dan kunci ketakberubahan.

Dalam pengeluaran, saya akan membina graf penunggu-ke-pemilik daripada pembuangan benang atau data penantian pangkalan data, sambil menghormati liputan setiap pengesan. Jika PostgreSQL mengesan kebuntuan transaksi, ia membatalkan satu transaksi. Saya akan mengundur dan mencuba semula keseluruhan transaksi dengan had, tanpa menganggap permintaan mana yang menjadi mangsa, dan menerbitkan mesej luaran hanya melalui laluan pasca-komit yang idempoten.

Untuk pengesahan, penghalang membolehkan A mengunci 42 dan B mengunci 84 sebelum kedua-duanya meminta kunci kedua, menghasilkan semula pelaksanaan lama secara boleh dipercayai. Versi tersusun menerima input terbalik yang sama dan sepatutnya hanya menunjukkan penantian tak berkitar sebelum selesai. Saya juga akan menguji akaun yang sama, operasi tiga akaun, pembersihan pengecualian, tugas pintasan, dan pengunduran pangkalan data sambil memeriksa jumlah baki, kesan sampingan pendua, kiraan kebuntuan, dan kegagalan terminal."

Jawapan ini menghubungkan definisi, bukti, pilihan kejuruteraan, pemulihan, dan pengesahan. Jika penemu duga hanya meminta empat syarat, berhenti selepas perenggan kedua. Kembangkan kepada perkakasan dan sempadan percubaan semula apabila pengendalian pengeluaran menjadi soalan susulan.

Kesilapan Biasa

  • Mengisytiharkan kebuntuan setiap kali benang disekat → Pemegang yang lama mungkin masih membuat kemajuan → Lukis tepi penunggu-ke-pemilik dan sahkan kitaran di bawah model tika sumber yang betul.
  • Hanya menghafal empat syarat → Jawapan tidak memetakan kod mahupun memilih remedi → Petakan setiap syarat kepada senario dan nyatakan syarat mana yang dipecahkan oleh reka bentuk.
  • Menyusun secara bebas di dalam setiap fungsi → Modul mungkin tidak bersetuju tentang kunci atau pangkat jenis sumber → Takrifkan hierarki kunci seluruh repositori dan periksa setiap titik masuk.
  • Mengabaikan ID sumber pendua → Satu benang mungkin memperoleh kunci bukan masuk semula yang sama dua kali → Nyahduplikasi sebelum menyusun dan takrifkan semantik pemindahan akaun yang sama.
  • Menganggap tamat masa sebagai reka bentuk tak berkitar → Susunan songsang kekal, dan tamat masa boleh membatalkan penantian yang sah → Lepaskan setiap kunci yang dipegang dan tambah undur terhad, ketakberubahan, dan ralat terminal.
  • Menyambung semula di pertengahan jalan selepas pengesanan kitaran → Keadaan separa boleh menjadi lapuk dan kesan sampingan boleh berulang → Undur dan jalankan semula transaksi lengkap dengan laluan pasca-komit yang idempoten.
  • Menganggap setiap kitaran graf sumber membuktikan kebuntuan → Tika luaran boleh melepaskan sumber berbilang tika → Asingkan graf tunggu-untuk tika tunggal daripada analisis peruntukan berbilang tika.
  • Membunuh pemilik kunci secara paksa → Invarian dalam-ingatan mungkin dikemas kini separuh jalan → Tangkap bukti dan mulakan semula hanya pada sempadan yang keadaannya boleh dibina semula.
  • Hanya menjalankan tekanan rawak → Kegagalan untuk menghasilkan semula tidak membuktikan ketiadaan susunan songsang → Betulkan jalinan dengan penghalang, kemudian tambah ujian rendaman untuk laluan yang tidak diketahui.

Soalan Susulan dan Respons

Susulan 1: Adakah penyusunan masih berfungsi apabila pemindahan mengunci tiga akaun?

Ya, jika set kunci yang lengkap dan dinyahduplikasi diketahui sebelum pemerolehan dan disusun mengikut kunci stabil yang sama. Jika pelaksanaan menemui akaun secara dinamik, baca set calon tanpa kunci, peroleh bersama-sama, dan sahkan semula versi. Jika set tidak dapat diketahui, bahagikan transaksi atau gunakan pengesanan di sekitar sempadan yang mampu diundur dan bukannya memperoleh secara berperingkat mengikut susunan tempatan.

Susulan 2: Bagaimanakah anda menyusun jenis sumber yang berbeza?

Cipta pangkat komposit, seperti pelanggan sebelum akaun sebelum serpihan lejar (ledger shard), kemudian ID stabil dalam setiap jenis. Protokol kunci yang dikongsi memiliki peraturan tersebut, dan semakan serta ujian mengesahkan tepi rentas jenis. Jika satu operasi mesti masuk secara terbalik, reka bentuk semula arah panggilan atau lepaskan sumber peringkat lebih rendah sebelum melintasi sempadan dan bukannya menambah pengecualian sekali sahaja.

Susulan 3: Adakah tryLock dengan tamat masa 100 milisaat menyelesaikan kebuntuan?

Ia mengehadkan penantian percubaan ini kepada tetingkap yang dikonfigurasikan tetapi tidak membuktikan protokol tak berkitar. Seratus milisaat mungkin juga berada di bawah ekor bahagian genting yang sah dan mencipta kegagalan palsu. Takrifkan pelepasan kunci yang diperoleh, pengunduran keadaan separa, undur rawak terhad, ketakberubahan, dan ralat terminal; jika tidak, kebuntuan boleh menjadi kebuntuan hidup percubaan semula.

Susulan 4: Mengapakah menaik taraf kunci baca kepada kunci tulis berbahaya?

Jika dua benang kedua-duanya memiliki kunci baca yang dikongsi dan kedua-duanya menunggu untuk menaik taraf kepada tulis eksklusif, setiap kunci baca menyekat peningkatan yang lain dan membentuk kitaran. Utamakan protokol peningkatan eksplisit yang dibekalkan oleh pustaka. Tanpa protokol tersebut, lepaskan kunci baca, bersaing untuk kunci tulis, dan sahkan semula syarat kerana keadaan mungkin berubah semasa jurang tersebut.

Susulan 5: Jika PostgreSQL mengesan kebuntuan secara automatik, apakah yang tinggal untuk aplikasi?

Gunakan susunan berbilang objek yang konsisten untuk mengurangkan kejadiannya dan anggap ralat kebuntuan sebagai kegagalan keseluruhan transaksi. Baca semula dan cuba semula dengan had, jadikan permintaan itu idempoten, dan rekod percubaan semula serta kegagalan terminal. Jangan anggap transaksi tertentu sentiasa kalah atau mengulangi tindakan luaran yang tidak boleh diubah selepas pengunduran.

Susulan 6: Bagaimanakah kebuntuan (deadlock), kebuntuan hidup (livelock), dan kebuluran (starvation) berbeza?

Peserta yang mengalami kebuntuan tidak boleh maju kerana kitaran penantian. Peserta yang mengalami kebuntuan hidup melaksanakan dan mengubah keadaan tetapi berulang kali mengalah atau mencuba semula tanpa selesai. Kebuluran bermaksud seorang peserta dinafikan sumber untuk masa tanpa batas sementara yang lain mungkin selesai. Bukti mereka berbeza: kitaran penantian, perubahan keadaan berterusan tanpa penyiapan, dan penantian tidak adil yang berterusan.

Sumber awam

Soalan berkaitan