Situasi ini sering kita jumpai dalam database: tabel utama A dan subtabel B. Tabel B berisi kunci utama tabel A sebagai kunci asing. Saat kita ingin memasukkan data, kita masukkan terlebih dahulu ke tabel A, lalu ambil Identitas tabel A, lalu masukkan ke tabel B. Jika Anda ingin melakukan operasi penghapusan, hapus subtabel B terlebih dahulu, lalu hapus tabel utama A. Dalam pemrograman, operasi pada dua tabel diselesaikan dalam satu transaksi.
Jika sistem sering digunakan, operasi penyisipan dan penghapusan dapat terjadi secara bersamaan. Pada saat ini, transaksi penyisipan pertama-tama akan menempatkan kunci eksklusif pada tabel utama A, dan kemudian mengakses sub-tabel B. Pada saat yang sama, transaksi penghapusan akan menempatkan kunci eksklusif pada sub-tabel B, dan kemudian mengakses tabel utama A. Transaksi penyisipan akan selalu memonopoli tabel A, menunggu untuk mengakses tabel B, dan transaksi penghapusan juga akan memonopoli tabel B, menunggu untuk mengakses tabel A. Oleh karena itu, kedua transaksi tersebut saling memonopoli tabel, menunggu pihak lain melepaskan sumber daya, yang menyebabkan kebuntuan.
Saya pernah mendengar tiga cara untuk melakukan ini:
1. Batalkan hubungan kunci asing antara dua tabel AB, sehingga saat menghapus data, Anda dapat menghapus tabel utama A terlebih dahulu, lalu menghapus subtabel B, sehingga Urutan akses transaksi dari kedua operasi tabel ini konsisten.
2 Sebelum menghapus data pada tabel A, gunakan transaksi terlebih dahulu untuk mengarahkan kunci asing yang relevan pada tabel B ke data lain pada tabel A (misalnya, buat baris data pada tabel A dan atur kunci utama ke 0. Baris ini data tidak akan pernah bisa diakses. Lakukan operasi hapus), sehingga menghilangkan hubungan antara data yang akan dihapus pada kedua tabel AB. Kemudian Anda dapat menggunakan transaksi hapus untuk menghapus data di tabel A terlebih dahulu, lalu menghapus data di tabel B untuk mencapai akses tabel yang konsisten dengan transaksi penyisipan dan menghindari kebuntuan.
3. Pada relasi kunci asing, atur "Delete Rule" menjadi "Cascading", sehingga transaksi penghapusan hanya perlu langsung menghapus tabel utama A, tanpa mengoperasikan subtabel B. Karena setelah aturan penghapusan disetel ke kaskade, data pada tabel utama akan dihapus, dan semua data yang terkait dengan kunci asing di subtabel juga akan dihapus pada saat yang bersamaan.
Ketiga solusi di atas semuanya merupakan saran yang diberikan oleh rekan-rekan, dan saya tidak tahu metode mana yang harus digunakan.
Saya ingin tahu apakah ada cara lain yang baik untuk mencegah kebuntuan dalam situasi ini?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html