Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menemukan penyebab kesalahan kebuntuan dari file jejak Oracle

Pertama-tama, select pernyataan tidak pernah mengunci apa pun di Oracle, cukup gunakan versi data terakhir yang tersedia secara konsisten. Ini bukan kasus untuk select ... for update yang mengunci data seperti update sejak Oracle 9i, tetapi tidak ada for update klausa dalam kueri dari pertanyaan.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Sesi #72 memegang kunci level tabel (TM) dengan tipe "Baris Eksklusif" (SX) dan ingin mendapatkan kunci "Berbagi Baris Eksklusif" (SSX) di meja yang sama. Sesi ini diblokir oleh Sesi #24 yang sudah memegang kunci level tabel dari jenis yang sama (SX) dan menunggu selama kunci SSX tersedia.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Ini (baris kedua) menunjukkan situasi yang persis sama, tetapi dalam arah yang berlawanan:Sesi #24 menunggu kunci SSX tersedia, tetapi diblokir oleh Sesi #72 yang telah menahan kunci SX di meja yang sama.

Jadi, Sesi #24 dan Sesi #72 saling menghalangi:terjadi kebuntuan.

Kedua jenis kunci (SX dan SSX) adalah kunci tingkat tabel.
Untuk memahami situasinya, saya sarankan untuk membaca artikel ini oleh Franck Pachot.

Di bawah ini adalah kutipan dari artikel ini, yang secara langsung relevan dengan situasi Anda (perhatikan bahwa singkatan SSX dan SRX setara):

Integritas referensial juga memperoleh kunci TM. Misalnya, masalah umum dengan kunci asing yang tidak diindeks mengarah ke kunci S pada tabel anak saat Anda mengeluarkan penghapusan, atau pembaruan pada kunci tersebut, pada tabel induk. Ini karena tanpa indeks, Oracle tidak memiliki satu pun sumber daya tingkat yang lebih rendah untuk dikunci untuk mencegah penyisipan bersamaan yang dapat melanggar integritas referensial.
Ketika kolom kunci asing adalah kolom utama dalam indeks biasa, maka entri indeks pertama dengan parentvalue dapat digunakan sebagai sumber daya tunggal dan dikunci dengan TXlock tingkat baris.
Dan bagaimana jika integritas referensial memiliki kaskade saat dihapus? Selain mode S, ada niat untuk memperbarui baris di tabel anak, seperti mode Baris X (RX). Di sinilah share rowexclusive (SRX) terjadi:S+RX=SRX.

Jadi, varian yang paling mungkin adalah Sesi #72 dan Sesi #24 menghapus beberapa baris di EMPLOYEE tabel pada saat yang sama, dan ada on delete cascade batasan untuk EMPSAL_EMP_ID sehubungan dengan tidak adanya indeks pada EMPLOYEE_SALARY tabel di mana EMPSAL_EMP_ID kolom dicantumkan terlebih dahulu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Prosedur Tersimpan SQL Server dari Oracle®

  2. 2 Cara Mengembalikan Baris yang Hanya Mengandung Karakter Alfanumerik di Oracle

  3. Bagaimana cara membuat database baru setelah awalnya menginstal database Oracle 11g Express Edition?

  4. Refleksi di PLSQL?

  5. EM 12c Menyesuaikan Nilai Ambang Batas