MySQL AUTO_INCREMENT: Membongkar Enigma Rollback
Dalam MySQL, menggunakan medan AUTO_INCREMENT dengan urus niaga InnoDB memberikan gelagat pemulangan yang pelik: nilai AUTO_INCREMENT. Memahami alasan di sebalik pilihan reka bentuk ini adalah penting.
Pertimbangkan senario berikut:
Senario:
- Program Satu memulakan transaksi dan memasukkan rekod ke dalam jadual FOO, memberikan nilai AUTO_INCREMENT 557.
- Program Dua juga memulakan transaksi, memasukkan rekod ke dalam FOO, memperoleh 558.
- Program Dua meneruskan untuk memasukkan rekod ke dalam BAR jadual, merujuk nilai 558 dalam FOO.
- Program Dua melakukan transaksinya.
- Program Tiga menjana laporan berdasarkan FOO jadual, termasuk rekod dengan nilai 558.
- Program Satu akhirnya melancarkan semula transaksinya.
Kembali dan AUTO_INCREMENT:
Sistem pangkalan data biasanya tidak mengembalikan nilai AUTO_INCREMENT kerana potensi implikasi:
-
Integriti Data: Jika nilai 557 dikurangkan semasa pemulangan semula, nilai rekod lain dengan kunci lebih besar daripada 557 akan menjadi tidak sah.
-
Kekangan Utama Asing: Rujukan kepada 558 dalam jadual BAR akan menjadi yatim piatu jika rekod 558 dalam FOO dialih keluar.
-
Ketidakkonsistenan Laporan: Laporan yang dijana oleh Program Tiga perlu diperbetulkan untuk mengecualikan rekod terbalik dengan nilai 557.
Penyelesaian dan Alternatif:
Walaupun medan AUTO_INCREMENT tidak boleh ditarik balik, terdapat penyelesaian alternatif untuk menangani keperluan khusus:
-
Rekod Tidak Lengkap: Untuk tujuan pengauditan , pertimbangkan untuk mengekalkan bendera status untuk rekod. Rekod yang ditandakan sebagai "Tidak Lengkap" semasa penciptaan boleh ditarik balik tanpa menjejaskan nilai AUTO_INCREMENT, memberikan jejak audit.
Melaksanakan penyelesaian ini memerlukan pertimbangan yang teliti terhadap integriti data, prestasi dan keperluan perniagaan khusus.
Atas ialah kandungan terperinci Mengapa Nilai MySQL AUTO_INCREMENT Tidak Digulung Kembali dalam Transaksi InnoDB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!