Bolehkah operasi serentak SELECT
atau INSERT
dalam sesuatu fungsi membawa kepada keadaan perlumbaan? Ya, terutamanya jika tidak diurus dengan betul.
Pemadaman teg serentak dan penciptaan siaran oleh berbilang pengguna boleh mewujudkan keadaan perlumbaan dalam fungsi jika kenyataan INSERT
dan SELECT
tidak dilindungi secukupnya.
Urus niaga pangkalan data adalah kunci untuk menghalang keadaan perlumbaan ini. Transaksi memastikan bahawa satu siri pernyataan SQL dilaksanakan sebagai unit atom tunggal. Jika mana-mana penyata dalam urus niaga gagal, keseluruhan urus niaga akan ditarik balik, mengekalkan ketekalan pangkalan data.
Walaupun kenyataan INSERT
mungkin dilindungi dalam transaksi (bermaksud pemadaman teg serentak akan menyebabkan transaksi gagal dan INSERT
dibatalkan), kenyataan SELECT
yang tidak dilindungi kekal terdedah. Jika teg dipadamkan selepas SELECT
bermula tetapi sebelum ia selesai, SELECT
akan gagal, yang berpotensi menyebabkan ralat fungsi.
Untuk menyelesaikan masalah ini, bungkus penyata SELECT
dalam transaksi yang sama. Ini boleh dicapai dengan memulakan transaksi pada permulaan fungsi:
<code class="language-sql">BEGIN TRANSACTION; -- SELECT and INSERT statements here COMMIT TRANSACTION;</code>
Ini memastikan kedua-dua operasi SELECT
dan INSERT
dianggap sebagai satu unit yang tidak boleh dibahagikan, menghalang keadaan perlumbaan yang disebabkan oleh tindakan pengguna serentak. Kenyataan COMMIT TRANSACTION
pada penghujung memuktamadkan transaksi, menjamin ketekalan pangkalan data.
Atas ialah kandungan terperinci Bolehkah PILIH atau INSERT Penyata Dalam Fungsi Menyebabkan Keadaan Perlumbaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!