Mengurangkan Keadaan Perlumbaan Semasa Peningkatan Medan dalam Pangkalan Data MySQL
Dalam senario di mana berbilang sambungan mengakses rekod pangkalan data MySQL yang sama untuk kemas kini serentak, a keadaan perlumbaan mungkin timbul, membawa kepada kemas kini yang tidak disengajakan dan tidak tepat. Ini boleh berlaku apabila kedua-dua sambungan mendapatkan nilai medan yang sama (cth., pembilang), menambahnya dan mengemas kini rekod dengan nilai meningkat masing-masing. Memandangkan kedua-dua sambungan beroperasi secara berasingan, nilai kemas kini akhir mungkin hanya mencerminkan satu kenaikan dan bukannya berbilang kenaikan yang dimaksudkan.
Untuk menangani isu ini, MySQL menyediakan pelbagai pendekatan:
Kemas Kini Atom
Kemas kini atom boleh digunakan untuk memastikan kenaikan medan berlaku serta-merta dan secara atom. Ini boleh dicapai melalui satu pertanyaan yang menambah medan, seperti yang dilihat di bawah:
update table set tries=tries+1 where condition=value;
Penguncian Baris
Penguncian baris ialah satu lagi penyelesaian yang berdaya maju. Dengan menggunakan teknik ini, sambungan boleh mengunci baris yang sedang dikemas kini. Ini memastikan bahawa hanya satu sambungan boleh mengubah suai baris pada satu masa, menghapuskan keadaan perlumbaan. Bersempena dengan penguncian baris, adalah disyorkan untuk menggunakan jadual InnoDB dan bukannya jadual MyISAM untuk sokongan. Contoh pertanyaan menggunakan penguncian baris akan menyerupai:
select tries from table where condition=value for update; .. do application logic to add to `tries` update table set tries=newvalue where condition=value;
Skim Versi
Pendekatan yang digunakan secara meluas ialah pengenalan lajur versi ke jadual pangkalan data. Lajur versi ini menjejaki perubahan pada rekod dan membantu dalam mengesan keadaan perlumbaan. Pertanyaan dengan pendekatan ini lazimnya mengikut corak ini:
select tries,version from table where condition=value; .. do application logic, and remember the old version value. update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;
Jika kemas kini gagal atau mengembalikan sifar baris yang terjejas, ini menandakan sambungan lain telah mengemas kini jadual secara serentak. Dalam kes sedemikian, proses mesti dimulakan semula, termasuk mendapatkan semula nilai yang dikemas kini, melaksanakan logik aplikasi dan mencuba kemas kini sekali lagi.
Atas ialah kandungan terperinci Bagaimana Anda Boleh Mengurangkan Keadaan Perlumbaan Semasa Peningkatan Medan dalam Pangkalan Data MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!