Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Haruskah SELECT ... FOR UPDATE selalu berisi ORDER BY?

Contoh Anda dalam pertanyaan Anda menunjukkan bahwa urutan penguncian tergantung pada metode akses. Jalur akses ini tidak secara langsung ditentukan oleh klausa ORDER BY dari kueri, ada banyak faktor yang dapat mempengaruhi jalur akses ini. Oleh karena itu, Anda tidak dapat mencegah kebuntuan hanya dengan menambahkan ORDER BY karena Anda masih dapat memiliki dua jalur akses yang berbeda. Bahkan dengan menjalankan test case Anda dengan urutan berdasarkan dan mengubah parameter sesi, saya dapat menyebabkan dua sesi menjalankan ORA-60 dengan kueri yang sama.

Jika sesi yang terlibat tidak memiliki kunci lain yang tertunda, kunci baris dalam urutan yang sama di semua sesi akan mencegah kebuntuan tetapi bagaimana Anda bisa memaksa pesanan ini dengan andal? Perhatikan bahwa ini hanya akan mencegah kasus kebuntuan yang sangat khusus ini. Anda masih bisa menemui jalan buntu dengan beberapa kueri di setiap sesi atau paket yang berbeda.

Dalam praktiknya, kasus ini benar-benar istimewa dan tidak boleh sering terjadi:jika Anda khawatir tentang kebuntuan, saya masih berpikir ada metode yang lebih mudah untuk mencegahnya.

Cara termudah untuk mencegah kebuntuan adalah dengan menggunakan FOR UPDATE NOWAIT atau FOR UPDATE WAIT X (walaupun TUNGGU X masih dapat memicu kebuntuan dengan nilai X lebih tinggi dari mekanisme deteksi kebuntuan, saat ini 3 detik pada 11g saya percaya -- terima kasih @APC untuk koreksi).

Dengan kata lain, kedua transaksi harus bertanya:beri saya baris itu dan kunci mereka tetapi jika pengguna lain sudah memiliki kunci, kembalikan kesalahan alih-alih menunggu tanpa batas. Penantian tanpa batas itulah yang menyebabkan kebuntuan.

Dalam praktiknya saya akan mengatakan bahwa sebagian besar aplikasi dengan pengguna orang sungguhan lebih suka menerima kesalahan segera daripada transaksi menunggu tanpa batas waktu untuk menyelesaikan transaksi lain. Saya akan mempertimbangkan FOR UPDATE tanpa NOWAIT hanya untuk tugas batch non-kritis.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan semua anak menurut orang tua dalam kueri mysql

  2. Mysql - JELASKAN PILIH dari TAMPILAN mencari di semua baris tabel utama

  3. Tampilkan hasil MySQL berdasarkan tanggal

  4. Kapan menggunakan MongoDB atau sistem database berorientasi dokumen lainnya?

  5. Dapatkan nilai dari database menggunakan PHP PDO dan perbarui input untuk diperiksa