Rumah  >  Artikel  >  pangkalan data  >  Mari kita bincangkan tentang kunci dua fasa Mysql dan kebuntuan

Mari kita bincangkan tentang kunci dua fasa Mysql dan kebuntuan

藏色散人
藏色散人ke hadapan
2022-12-05 15:55:172123semak imbas

Artikel ini membawa anda pengetahuan yang berkaitan tentang kunci MySQL terutamanya memperkenalkan kunci dua peringkat dan kebuntuan Mari kita lihat bersama-sama.

Kunci dua peringkat

Konsep

membincangkan tentang InnoDB cara mengendalikan penguncian dan pelepasan kunci baris.

Semasa proses transaksi, apabila rekod dipadamkan berdasarkan kunci utama, kunci eksklusif akan segera ditambah, yang melengkapkan kuncipentas.

Apabila tindakan pemadaman selesai, kunci tidak akan dilepaskan serta-merta. Ia akan melepaskan kunci sehingga transaksi dilakukan. Masalah yang disebabkan oleh

-menyekat

事务 A 事务 B
begin;
update t set k=k 1 where id=1;
update t set k=k 1 where id=2;


begin;
update t set k=k 2 where id=1;
commit;
Transaksi A

Transaksi B

bermula;
kemas kini set t k=k 1 di mana id=1;kemas kini set t k=k 1 di mana id=2;事务 B


mulakan;
kemas kini t set k=k 2 di mana id=1;
id=1komit;
事务 AMenurut protokol penguncian dua fasa, 事务 BIa akan disekat kerana data

dikunci oleh 事务 B事务 C事务 D, kerana 事务 B perlu mendapatkan kunci sebelum meneruskan operasi satu langkah.

Masalah di atas mungkin tidak kelihatan seperti masalah besar, tetapi jika ia bukan sahaja

, tetapi juga 事务 A, id=1, dsb., penyelesaiannya adalah sama seperti 事务 B masalah, masalah akan menjadi lebih besar, dan lebih banyak benang akan disekat. [Pembelajaran yang disyorkan: **热点行**Tutorial video MySQL

]

Cara menangani masalah di atas

Kita harus cuba sedaya upaya untuk meletakkan pernyataan yang boleh menyebabkan penyekatan pada penghujung transaksi, seperti Pernyataan

dalam contoh

di atas tidak ada kaitan dengan pelaksanaan ayat kedua, tetapi ia adalah pernyataan yang boleh menyebabkan penyekatan dengan mudah, kerana baris data ini juga mesti dikunci dalam

(Ia kerap digunakan dalam pelbagai urus niaga, seperti rekod baki akaun pembayaran syarikat, iaitu ), tetapi kunci telah diperoleh pada permulaan transaksi.

Pada asasnya, ia memendekkan masa antara pemerolehan kunci dan pelepasan kunci. Iaitu, masa kunci dipendekkan, dengan itu mengurangkan sekatan yang disebabkan oleh kunci.

Kebuntuan
  • Konsep事务 A资源 A

    Dua utas sedang menunggu antara satu sama lain untuk mengeluarkan sumber.
  • Dalam dua transaksi A dan B.

    事务 B资源 B

  • mendapat
  • kunci.

    事务 A资源 B

  • mendapat
  • kunci.

    事务 B资源 A

  • Pergi dapatkan kunci
.

Pergi dapatkan kunci

.

InnoDB5050Jelas sekali, dalam langkah 3 dan 4, kedua-dua transaksi A dan B ingin mendapatkan kunci, tetapi kedua-duanya tidak boleh mendapatkannya kerana pihak yang satu lagi belum melepaskan kunci pada sumber. Fenomena ini adalah jalan buntu. Masalah yang disebabkan oleh innodb_lock_wait_timeout

- Jalan buntu 1

Dalam 1, terdapat konfigurasi masa menunggu untuk pemerolehan kunci Jika masa ini melebihi masa ini, pengecualian akan dilemparkan. Kali ini lalai ialah

saat. Secara umumnya, adalah tidak boleh diterima untuk mempunyai antara muka yang mengambil masa

saat untuk bertindak balas. .

Adakah cukup untuk menetapkan masa konfigurasi lebih pendek? Suka

saat? InnoDBCPU tidak sepatutnya dibenarkan, kerana ia boleh menjejaskan perniagaan biasa anda Mungkin perniagaan anda menyebabkan masa pelaksanaan transaksi anda agak lama, melebihi

saat. Jika masa ini melebihi masa, pengecualian akan dilemparkan dan perniagaan biasa anda akan terjejas.

线程A线程ABagaimana untuk menangani masalah di atas?

innodb_deadlock_detectDalam

, terdapat juga konfigurasi untuk mengesan dan mengendalikan kebuntuan secara automatik. Ia didayakan secara lalai Dalam kes yang melampau, walaupun ia boleh menyelesaikan masalah, ia menggunakan banyak wang.

Prinsipnya ialah apabila transaksi akan dikunci, ia akan mengesan sama ada rangkaian serentak lain telah mengunci sumber ini Jika ia mengesan bahawa

tertentu, ia akan mengesan 15 Sama ada kebergantungan dikunci oleh benang serentak lain, dan seterusnya, dan akhirnya menentukan sama ada kunci ini akan membentuk jalan buntu. 15

Dapat dilihat bahawa lebih banyak benang, lebih tinggi kos pengesanan.

. MysqlMysqlHanya mewakili pemprosesan dan ringkasan masalah ini berdasarkan pembelajaran semasa peribadi:

1 Matikan pengesanan jalan buntu dan pendekkan konfigurasi masa penahanan kunci kepada anggaran masa tertinggi, biasanya Ia akan tidak melebihi

saat Selepas saat, mekanisme cuba semula diperlukan. 2. Hidupkan pengesanan jalan buntu, kawal bilangan sambungan serentak pada lapisan aplikasi, gunakan kumpulan sambungan untuk mengawal bilangan sambungan dan hadkan bilangan maksimum sambungan pada lapisan perkhidmatan. Di atas ialah ringkasan cara mengurangkan kesan prestasi kunci baris.

Atas ialah kandungan terperinci Mari kita bincangkan tentang kunci dua fasa Mysql dan kebuntuan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam