Mengapa MySQL AUTO_INCREMENT Tidak Terjejas Oleh Rollback
Medan AUTO_INCREMENT MySQL mengekalkan nilai unik tanpa mengira status transaksi. Tingkah laku ini berpunca daripada senario berikut:
Senario:
- Program satu menyisipkan rekod ke dalam jadual FOO, menjana nilai 557 untuk utamanya yang ditambah secara automatik kunci.
- Program dua memasukkan rekod ke dalam jadual FOO, mendapatkan semula nilai 558.
- Program dua memasukkan nilai 558 ke dalam BAR jadual sebagai kunci asing.
- Program dua komit.
- Program satu berguling kembali.
Masalah:
Menuntut semula nilai 557 selepas pemulangan semula mencipta beberapa isu yang tidak dapat diselesaikan:
- Mengurangkan nilai kunci utama dalam FOO akan menjejaskan rekod lain dengan nilai yang lebih tinggi.
- Mengubah suai BAR memerlukan pengalihan keluar kunci asing, yang boleh memberi kesan kepada data lain.
- Memadamkan laporan bercetak daripada program tiga secara praktikalnya mustahil.
Akibat:
Atas sebab ini, nombor jujukan Oracle juga beroperasi secara bebas daripada transaksi.
Penyelesaian:
Jika mengekalkan nilai kenaikan automatik tanpa celah adalah pengembalian transaksi yang penting tidak boleh digunakan. Sebaliknya, bendera status boleh ditambahkan pada rekod:
- Setelah sisipan awal, tetapkan status kepada "Tidak Lengkap."
- Semasa transaksi, kemas kini status kepada "Lengkap" apabila operasi berjaya.
- Serahkan urus niaga untuk menandai rekod sebagai langsung.
- Jika urus niaga berbalik, rekod yang tidak lengkap kekal untuk tujuan pengauditan.
Penyelesaian ini memperkenalkan cabarannya sendiri tetapi menyediakan cara untuk mengekalkan jejak audit sambil mengelakkan jurang kenaikan automatik.
Atas ialah kandungan terperinci Mengapa AUTO_INCREMENT MySQL Tidak Ditetapkan Semula Selepas Rollback?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan:Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn