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

Oracle Locks &table locks:Cara kerjanya

Database Oracle adalah database yang banyak digunakan di industri. Di sini saya mencoba menjelaskan  tentang kunci oracle, kunci tabel oracle

Daftar Isi

Apa itu Enqueue dan kunci Oracle

Enqueue adalah kunci Oracle yang membuat serial operasi ke struktur bersama. Struktur bersama dapat berupa tabel, pengulangan utas, dan transaksi.

Ketika pengguna A memperbarui baris 12 dalam tabel, itu memperoleh Enqueue transaksi (lock). Ini diperoleh sehingga Setiap pengguna yang saya coba perbarui baris yang sama 12 dalam tabel akan menunggu hingga pengguna A melakukan transaksi. Jadi sekarang jika pengguna B mencoba memperbarui baris yang sama, itu akan menunggu di enqueue.

Setelah pengguna A melakukan transaksi, transaksi Pengguna B akan dilanjutkan

Kami memiliki enqueue lokal dalam database instance tunggal sementara dengan Oracle RAC, kami memiliki enqueue lokal dan enqueue global untuk mengelola sumber daya bersama

Apa itu pengenal Enqueue

Enqueue diidentifikasi secara unik menggunakan format

Sumber daya dapat

TM -> kunci tabel

MR-> Pemulihan media

TX-> Transaksi

Id1 dan id2 adalah angka yang berbeda untuk jenis resource yang berbeda

Seperti untuk table lock (TM), ditulis sebagai

TM--0

Ketika pengguna meminta akses ke sumber daya dalam mode tertentu, pengenal enqueue dihasilkan yang dijelaskan di atas

Enqueue ditahan dalam mode ini

SS:  Mode berbagi baris

SX:Mode eksklusif baris

S:  Mengunci tabel dalam mode berbagi

SSX:Kunci tabel dalam mode berbagi dan baris dalam mode eksklusif

X:Kunci meja dalam mode eksklusif

Apa itu sumber daya Enqueue

Setiap enqueue dipelihara melalui struktur sumber daya oleh server Oracle dan diidentifikasi seperti yang dijelaskan di atas. Struktur sumber daya memiliki tiga daftar

  1. Daftar pemilik
  2. Daftar tunggu
  3. Daftar pengonversi

Ketika pengguna meminta kunci pada sumber daya dalam mode tertentu, ia memperoleh struktur kunci dan membuat permintaan untuk memperoleh kunci pada sumber daya tertentu. Ini ditempatkan dalam daftar struktur sumber daya ini sesuai dengan kunci yang diperlukan.

Jadi pengguna   pertama-tama meminta resource tersebut, kemudian akan ditempatkan di daftar pemilik

Struktur sumber daya diperoleh dari tabel Sumber daya dan struktur kunci diperoleh dari tabel Kunci. Keduanya dialokasikan di SGA

Jumlah baris dalam tabel resource ditentukan oleh parameter inisialisasi enqueue_resources. Nilai yang digunakan dapat dilihat di v$resource view

Jumlah baris dalam tabel struktur kunci ditentukan oleh parameter inisialisasi _enqueue_locks. Nilai yang digunakan dapat dilihat di v$enqueue_lock

Bagaimana pencarian dilakukan di tabel Resource?

  • Tabel sumber daya berisi semua struktur sumber daya. Algoritme hashing digunakan untuk menemukan dan mengakses struktur sumber daya dalam tabel sumber daya.
  • Tabel sumber daya diatur dalam keranjang hash. Setiap keranjang hash berisi daftar struktur sumber daya dalam bentuk daftar tertaut.
  • Ketika sumber daya dicari, hashnya diperoleh menggunakan algoritma hashing dan kemudian latch diperoleh untuk menemukan keranjang hash yang sesuai dan kemudian sumber daya dicari pada daftar di keranjang hash. Jika sumber daya ditemukan, struktur Kunci diperoleh dan permintaan ditempatkan pada daftar pemilik, pelayan, dan konversi sesuai dengan tingkat kunci yang diminta

Contoh TM-575-0 resource hash ke bucket 1, Rantai hash enqueue latch diperoleh untuk mengakses hash bucket dan daftar diakses di bucket untuk mendapatkan struktur resource

  • Jika sumber daya tidak ditemukan dalam daftar ember dan struktur sumber daya baru diperoleh dari daftar bebas sumber daya dan ditempatkan dalam daftar ember. Hal ini terjadi di bawah Enqueue latch. Struktur kunci juga dialokasikan

Permintaan kunci ditempatkan pada daftar pemilik struktur sumber daya

Bagaimana cara kerja operasi enqueue?

Ketika pengguna meminta kunci pada sumber daya, server Oracle melakukan hal-hal berikut

  • Jika saat ini tidak dimiliki, sumber daya diberikan kepada pengguna
  • Jika dimiliki dan ada pramusaji dan konverter, maka ditempatkan di bagian bawah antrian pramusaji
  • Jika dimiliki tetapi tidak ada pelayan dan konverter maka jika sesuai dengan kunci pemilik, permintaan dikabulkan. Jika tidak kompatibel, maka ditempatkan  pada daftar pelayan
  • Konverter diizinkan untuk melanjutkan jika permintaan tidak terlalu membatasi daripada kunci yang dipegang saat ini atau mode yang diminta kompatibel dengan kunci yang dipegang oleh pemilik lain
  • Pelayan diperbolehkan untuk melanjutkan jika daftar konverter kosong, tidak ada pelayan di depannya dan kunci yang diminta kompatibel dengan kunci yang ada saat ini
  • Konverter selalu diproses sebelum pelayan.
  • Server Oracle memeriksa antrean ini setiap kali kunci dilepaskan atau dikonversi.

Bagaimana antrian diperiksa ketika kunci Oracle dilepaskan atau dikonversi

  • Proses menunggu sumber daya tidur pada semafor, dan semafor digunakan sebagai mekanisme tidur/bangun. Setelah masuk ke antrian, proses permintaan akan tidur di semaphore menggunakan panggilan sync_op.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Setelah proses yang memegang sumber daya siap untuk melepaskan sumber daya, proses tersebut akan melihat antrian yang melekat pada struktur sumber daya. Jika ada proses dalam antrian, ia mengirimkan sinyal semaphore ke proses menunggu menggunakan

panggilan sync_op.

sync_op(0x0005, SYNCF_BINARY, 134491620) =1

  • Proses menunggu akan menangani sinyal dan akan bangun. Proses menunggu ini mengubah status sesuai langkah-langkah yang diberikan dalam operasi enqueue

Jenis antrian yang umum

JQ – Antrian Pekerjaan. Ketika suatu pekerjaan (dikirim oleh DBMS_JOB.SUBMIT) sedang berjalan, pekerjaan tersebut dilindungi oleh enqueue JQ (yang berarti bahwa hanya satu proses SNP yang dapat menjalankan pekerjaan tersebut).

ST – Transaksi pengelolaan ruang . Enqueue ST perlu diadakan setiap kali sesi mengalokasikan/mengurangi alokasi (yang berarti  ingin mengubah tabel kamus UET$ dan FET$), seperti penggabungan, segmen jatuhkan/potong, dan penyortiran disk. Jika sesi mendapatkan waktu tunggu saat meminta ST enqueue, “ORA-1575 timeout waiting for space management” akan ditampilkan.

TM – DML (Tabel)  antrean. Setiap kali sesi ingin mengunci tabel, TM enqueue diminta. Jika sesi menghapus baris di tabel induk (DEPT) dan batasan referensial (kunci asing) dibuat tanpa indeks pada tabel anak (EMP), atau jika sesi memperbarui kolom yang referensi kunci untuk kemudian kunci berbagi (level 4)  diambil di tabel turunan. Jika sesi lain mencoba melakukan perubahan pada tabel anak, mereka harus menunggu (karena mereka ingin enqueue dalam mode eksklusif baris, dan itu tidak kompatibel dengan mode berbagi). Jika indeks dibuat pada kolom kunci asing tabel anak, maka tidak ada kunci berbagi yang diperlukan pada tabel anak.

TX – Transaksi. Segera setelah transaksi dimulai, TX enqueue diperlukan. Sebuah transaksi secara unik ditentukan oleh nomor segmen rollback, nomor slot di tabel transaksi segmen rollback dan nomor urut nomor slot. Sesi dapat menunggu di enqueue TX karena beberapa alasan:

1) Sesi lain mengunci baris yang diminta.

2) Ketika dua sesi mencoba memasukkan kunci unik yang sama ke dalam tabel (tidak satupun dari mereka telah melakukan COMMIT), maka sesi terakhir menunggu yang pertama untuk COMMIT atau ROLLBACK.

3) Tidak ada ITL (Daftar Transaksi Tertarik) gratis di header blok (tambah INI_TRANS och PCT_FREE untuk segmen).

UL – Kunci Pengguna . Sesi telah dikunci dengan Fungsi DBMS_LOCK.REQUEST.

Tampilan dan Tabel untuk melihat enqueue Oracle dan kunci Oracle

V$session dan v$session_wait

Kapan sesi menunggu di enqueue atau mengunci, ini bisa menjadi sesi dari V$session (dalam 11g ke atas) dan v$session_wait

Pilih * dari v$session_wait tempat peristiwa seperti 'enq%';Parameter peristiwa tunggu enqueue   memiliki arti sebagai berikutP1:jenis sumber daya dan mode yang diinginkanP2:ID1 sumber dayaP3:ID2 sumber daya

Kita dapat menggunakan query di bawah ini untuk mendapatkan semua enqueue dalam sistem

Pilih acara,p1, p2,p3 dari v$session_wait  di mana wait_time=0 dan acara seperti 'enq%';
  1. V$lock adalah tampilan lain yang berguna untuk memeriksa enqueue's
  2. V$lock daftar semua struktur kunci yang saat ini disimpan di sistem
  3. Jenis kolom ,id1 dan id2 mewakili jenis resource  ,id1 dan id2 dari struktur resource. sehingga dapat digabungkan dengan V$resource yang berisi daftar semua struktur resource
  • LMODE dan permintaan memberi tahu kita antrian mana (pemilik, konverter, pelayan) yang merupakan sesi
LMODE Permintaan Nama antrian
> 0 =0 Pemilik
=0 > 0 Pelayan
> 0    >  0 Konverter

Permintaan di bawah ini dapat digunakan untuk menemukan pemegang dan pelayan

SELECT inst_id,DECODE(request,0,'Holder:','Waiter:')||sid sess,id1, id2, lmode, request, typeFROM V$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, ketik FROM V$LOCK WHERE request>0)ORDER BY id1, request;

Dalam kasus RAC, kueri di bawah ini dapat digunakan untuk mengetahui pemblokir dan pelayan

SELECT inst_id,DECODE(request,0,'Holder:','Waiter:')||sid sess,id1, id2, lmode, request, typeFROM GV$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, ketik FROM gV$LOCK WHERE request>0)ORDER BY id1, request;

V$locked_object

itu adalah tampilan lain yang berguna untuk kunci tabel Oracle

Ini berisi semua kunci TM dalam database. Ini memberikan slot transaksi, proses OS dan id sesi dari sesi yang memegang kunci TM

Ada beberapa tampilan yang dapat digunakan untuk menemukan informasi kunci. Tampilan ini dibuat oleh catblock.sql

DBA_LOCKS Tampilkan semua kunci seperti v$lock
DBA_DML_LOCKS Menampilkan semua kunci DML™ yang ditahan atau diminta
DBA_DDL_LOCKS Menampilkan semua kunci DDL yang ditahan atau diminta
DBA_WAiters Menampilkan semua sesi menunggu, tetapi tidak menahan menunggu kunci
DBA_BLOCKERS Menampilkan sesi non-menunggu yang menahan kunci yang sedang menunggu

Kueri untuk mengetahui sesi tunggu dan sesi mengadakan di Oracle 

setel ukuran baris 1000column waiting_session heading 'WAITING|SESSION'column holding_session heading 'HOLDING|SESSION'column lock_type format a15column mode_held format a15column mode_requested format a15selectwaiting_session,holding_session,lock_type,mode_held,lock_mode_requested 

Kueri untuk mengetahui semua objek yang terkunci

set term on;set lines 130;column sid_ser format a12 heading 'session,|serial#';column username format a12 heading 'os user/|db user';kolom format proses a9 heading 'os|process';kolom spid format a7 heading 'trace|number';column owner_object format a35 heading 'owner.object';columnlocked_mode format a13 heading 'locked|mode';format kolom status a8 heading 'status';selectsubstr(to_char(l.session_id)| |','||to_char(s.serial#),1,12) sid_ser,substr(l.os_user_name||'/'||l.Oracle_username,1,12) nama pengguna,l.process,p.spid, substr(o.owner||'.'||o.object_name,1,35) owner_object,decode(l.locked_mode,1,'No Lock',2,'Row Share',3,'Row Eksklusif',4 tempat .object_id =o.object_idand l.session_id =s.sidand s.paddr      =p.addrand s.status !='KILLED'/

Bagaimana kunci DML ditangani di server Oracle

Saat pembaruan, penyisipan, penghapusan, atau pemilihan pembaruan dijalankan pada tabel oracle, Oracle mengambil dua kunci ini

  • Kunci Tabel DML:Untuk memastikan konsistensi definisi objek selama durasi transaksi. Ini mencegah operasi DDL terjadi saat DML sedang berlangsung.
  • DML Row Lock:Ini untuk memastikan konsistensi data selama eksekusi transaksi. Kita dapat menyusun ulang seperti Ini mendapatkan kunci pada baris tertentu yang disentuh dan transaksi lain yang mencoba mengubah baris yang sama akan diblokir, hingga transaksi yang sudah memilikinya selesai

Bagaimana kunci tabel Oracle Diimplementasikan

Kami sudah menjelaskan infrastruktur Enqueue di bagian sebelumnya. Kunci Tabel Oracle diimplementasikan sebagai TM Enqueue

Jadi struktur Enqueue adalah

TM- -0

Modenya adalah

RS:pembagian baris

RX:eksklusif baris

S:bagikan

SRX:bagikan baris eksklusif

X:eksklusif

Setiap kursor mempertahankan daftar struktur kunci tabel yang dibangun saat menguraikan pernyataan. Pada eksekusi pertama, panggilan fungsi dibuat untuk mengunci semua tabel dalam daftar. Kunci dilepaskan saat transaksi dilakukan atau dikembalikan.

Kemungkinan rollback, khususnya rollback ke save point, menambah dimensi lain dari kompleksitas penguncian kamus. Yaitu, jika transaksi dibatalkan melampaui titik di mana kunci ditingkatkan, maka kunci harus diturunkan secara bersamaan, sebagai bagian dari operasi rollback, untuk mengurangi risiko kebuntuan buatan.

Persyaratan penguncian kamus untuk transaksi dan, khususnya, pemeliharaan riwayat konversi kunci, disediakan oleh kunci DML bersama dengan TM enqueue. Setiap transaksi yang memegang kunci DML juga memiliki kunci enqueue TM. Fungsionalitas penguncian dasar disediakan oleh enqueue, dan kunci DML menambahkan pemeliharaan riwayat konversi.

Array tetap struktur kunci DML diukur dengan parameter DML_LOCKS. Daftar gratisnya dilindungi oleh kunci alokasi kunci dml, dan slot aktifnya terlihat di V$LOCKED_OBJECT .

Untuk menyetel DML_LOCK, periksa penggunaan di v$resource_limit. Kita dapat mengaturnya dengan murah hati karena membutuhkan ruang yang sangat sedikit

Bagaimana  cara menonaktifkan kunci tabel?

  • Kunci DML dan kunci enqueue TM terkait dapat dinonaktifkan, baik seluruhnya, atau hanya untuk tabel tertentu.
  • Untuk menonaktifkan kunci ini sepenuhnya, parameter DML_LOCKS harus disetel ke nol. Dalam database server paralel, harus disetel ke nol di semua instance.
  • Untuk menonaktifkan penguncian tersebut pada tabel tertentu, klausa DISABLE TABLE LOCKS dari pernyataan ALTER TABLE harus digunakan.
  • Jika kunci dinonaktifkan untuk tabel, pernyataan DML masih dapat mengubah blok tabel, dan kunci tingkat baris tetap dipertahankan. Namun, kunci tabel mode sub-bersama yang biasanya terkait dengan kueri, dan kunci tabel mode sub-eksklusif yang biasanya terkait dengan DML, tidak diambil. Sebaliknya, transaksi terhadap tabel dilindungi dari DDL yang bertentangan dengan hanya melarang semua upaya untuk mengunci seluruh tabel, dan dengan demikian semua DDL terhadap tabel.
  • Menonaktifkan kunci tabel dapat meningkatkan kinerja karena overhead akuisisi kunci berkurang   Ini lebih penting khususnya jika RAC di mana overhead ini cukup tinggi.
  • Menonaktifkan kunci tabel juga mencegah pembuatan indeks kunci asing. Sebagai kunci asing perlu diindeks untuk menghindari kunci tabel dari tabel anak sementara baris dimanipulasi dalam tabel induk. Jadi jika kita menonaktifkan kunci tabel bersama-sama maka indeks tidak diperlukan
  • Lebih baik menggunakan tabel ubah untuk menonaktifkan kunci tabel pada beberapa tabel daripada mengatur ke tabel dml_locks. Seolah dml_locks disetel ke nol, kita perlu memantulkan instance untuk menyetelnya lagi
  • Dalam penyisipan beban langsung, sesi akan mengambil TM enqueue dalam mode 'X'. Ini mencegah DML lain terjadi saat pemuatan langsung terjadi, selain memblokir semua DDL

Bagaimana kunci baris DML diterapkan

Kunci Baris DML diimplementasikan sebagai kombinasi dari dua hal berikut

  1. Kunci tingkat baris:Diimplementasikan sebagai byte kunci di setiap header baris dan ITL (daftar transaksi yang diminati)  di setiap blok data atau indeks. Ini tidak di-cache di mana pun dan karena disimpan di blok itu sendiri, bukan di SGA yang terbatas, mekanisme Locking by oracle ini dapat diskalakan secara besar-besaran
  2. Kunci transaksi:Ini diimplementasikan sebagai TX Enqueue

Byte kunci menunjuk ke entri ITL di blok dan Semua entri ITL untuk transaksi menunjuk ke Enqueue TX yang pada akhirnya menentukan apakah transaksi dilakukan atau dibatalkan. Pelayan akan menunggu di kunci transaksi

Contoh

  • Transaksi A ingin memperbarui baris 2 dan 3 di blok. Ini akan mengalokasikan ITL (daftar transaksi yang tertarik). Transaksi mengakses baris 2 dan 3 dan melihat byte kunci .Jika byte kunci adalah  nol, byte kunci tidak terkunci. Transaksi akan memperbarui baris 3 ,3
  • Sekarang transaksi B dimulai   dan ingin memperbarui baris 1 . Ini akan mengalokasikan ITL (daftar transaksi yang tertarik). Transaksi mengakses baris 1  dan melihat byte kunci .Jika byte kunci adalah  nol, byte kunci tidak terkunci. Transaksi akan memperbarui baris 1
  • Sekarang transaksi ingin memperbarui baris 2. Ini akan mengakses baris dan akan menemukannya terkunci karena byte kunci tidak akan nol. Ini akan terlihat di ITL yang memegang kunci. Ia akan melakukan ITL cleanout untuk mengetahui apakah transaksi tersebut aktif atau tidak. Dalam hal ini, ia akan menemukan Transaksi A aktif. Jadi transaksi B harus menunggu transaksi A untuk melakukan rollback atau commit. Transaksi B akan menunggu untuk meminta Enqueue TX yang ditahan oleh transaksi A dalam mode eksklusif

Apa itu Daftar Transaksi Tertarik (ITL)

Ketika sebuah sesi ingin memodifikasi sebuah blok, ia harus mengalokasikan sebuah ITL di dalam blok tersebut. ITL adalah struktur data pada header blok yang berisi banyak slot yang diambil oleh transaksi. Ini didefinisikan oleh parameter INITRANS dan MAXTRANS ketika tabel dibuat. Jumlah awal slot dibuat sesuai INITTRANS dan mereka tumbuh secara dinamis hingga maksimum MAXTRANS

Apa itu transaksi?

Saat sesi memperbarui /delete/insert  , maka transaksi dimulai. Itu selesai ketika komit atau rollback terjadi. Transaksi diidentifikasi oleh pengenal transaksi (XID). Identifikasi transaksi terdiri dari tiga bagian

  1. Kembalikan atau urungkan nomor segmen
  2. Nomor slot meja transaksi
  3. No urut atau bungkus

XID=usn#.slot#.wrap#

Setiap blok ITL akan berisi XID

Pembersihan ITL berarti mencari XID di ITL dan mencari segmen rollback berdasarkan ini dan mencari tabel transaksi dan nomor bungkus untuk memeriksa keaktifan transaksi.

Kita dapat menggunakan perintah di bawah ini untuk membuang segmen rollback apa pun

Ubah header undo dump sistem ;

Setiap transaksi yang aktif dapat dilihat pada tabel v$transaction

pilih addr, xidusn, xidslot, xidsqnfrom v$transaction;ADDR         XIDUSN    XIDSLOT     XIDSQN-------- ---------- ---------- --- -------3C485875         50        5      3000

Pengenal transaksi (XID) juga dapat diperoleh di sesi sendiri menggunakan

pilih dbms_transaction.local_transaction_id dari dual;

Penantian di TX enq akan terlihat di v$session_wait

P1:Nama|modus

P2:rbs3|bungkus#

P3:slot#

Untuk meringkas kunci baris DML

DML pertama dalam sesi di mana transaksi belum ada secara implisit akan membuat transaksi.

  • Nomor segmen, slot, dan bungkus akan ditetapkan
  • antrean TX akan dipakai

Ketika baris yang akan dimodifikasi diidentifikasi, sesi akan mengambil entri di ITL dari blok data, menetapkannya ke transaksi

  • USN/SLOT/WRAP akan ditulis ke slot ITL, menyimpan slot itu untuk transaksi saat ini
  • Penguncian akan diambil pada baris, dengan mengatur byte kunci di direktori baris untuk menunjuk ke slot ITL transaksi saat ini

Baik TM dan TX Enqueue dapat dilihat di V$lock

  • Jenis mengidentifikasi TM atau TX
  • ID1 dan ID2 dapat membawa informasi tambahan, tetapi peka konteks sehubungan dengan JENIS enqueue
  • Untuk TM enqueue, ID1 adalah OBJECT_ID dari objek yang dikunci, yang dapat dirujuk dalam DBA_OBJECTS, dan ID2 selalu 0
  • Untuk TX Enqueue, ID1 dan ID2 menahan nomor segmen undo, nomor slot, dan wrap

Contoh Detail untuk menjelaskan cara kerja kunci oracle

  • Buat tabel dummy
Buat tabel dari j sebagai pilih * dari dba_objects di mana rownum <3;Tabel dibuat Buat tabel dari j1 sebagai pilih * dari dba_objects di mana rownum <3;Tabel dibuat
  • Sesi A
Pilih * dari j untuk pembaruan;

Mari kita lihat apa saja yang ada di v$lock

SQL> pilih sid yang berbeda dari v$mystat; SID----------2125SQL> pilih * from v$lock where sid=2125;ADDR           KADDR                SID TY       ID1       ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- -----REQUEST      CTIME      BLOK---------- ---------- ----------00000006B5D9D0D0 00000006B5D9D148       2125 TX    2883613   16425600         60         44    FFDA 21488781         0         30        44         0

Jadi kita lihat di sini

Kunci tabel Oracle DML telah dibuat

TX(kunci transaksi) dibuat

  • Mari kita mulai sesi B
SQL>Pilih * dari j1 untuk pembaruan;SQL> pilih sid yang berbeda dari v$mystat; SID----------2302SQL> pilih * dari v$lock where sid=2302;ADDR           KADDR                SID TY       ID1       ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- -----REQUEST      CTIME      BLOK---------- ---------- ----------00000006AF7FF910 00000006AF7FF988       2302 TX    2949148   16884039        60         10       FFDA 0    FFDA 33544         0         30        10         000000006DC289D60 00000006DC289DB8      2302 AE   15062272         0                40  

Jadi kita lihat di sini

Kunci tabel DML dibuat

TX(kunci transaksi) dibuat

Sekarang mari kita coba lakukan

Pilih * dari j untuk pembaruan;

Ini akan digantung

  • Mari kita mulai sesi lain untuk menganalisis masalah

Jika Anda melihat detail sesi sid =2032 di V$lock

pilih * dari v$lock where sid=2302;ADDR            KADDR                SID TY       ID1       ID2      LMODE---------------- ------------- --- ---------- -- ---------- ---------- ----------PERMINTAAN      WAKTU      BLOKIR-- -------- ---------- ---------- FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 33544 0 30 47 000000006DC289D60 00000006DC289DB8 2302 2302 TX    2883613   16425600         0          6         7          0 FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM   21488781         0         30         7         0

Baris yang dicetak tebal adalah permintaan 6 (kunci eksklusif) pada beberapa enq TX

Sekarang kita dapat menggunakan kueri di bawah ini untuk menemukan sesi pemblokiran

pilih l1.sid, ' IS BLOCKING ', l2.sidfrom v$lock l1, v$lock l2where l1.block =1 and l2.request> 0and l1.id1=l2.id1and l1.id2=l2.id2SID 'ISBLOCKING'         SID---------- ------------- ----------2125  ADALAH PEMBLOKIRAN       2302

Sekarang kita dapat melakukan atau mengembalikan sesi 2125 agar transaksi B dapat dilanjutkan. Kita dapat mematikan sesi 2125 menggunakan perintah di bawah ini juga untuk melepaskan kuncinya

Ubah sesi penghentian sistem '2125,';

Beberapa informasi tambahan lainnya

TX locks in v$lock tidak memberi tahu informasi baris tempat pertikaian muncul. Kita dapat melihat hal-hal itu menggunakan kueri

Kueri di bawah ini harus dijalankan dari sesi yang menunggu

SQL> pilih row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#from v$session where sid=2302ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#------------- ----- --------- --------------- -------------21488781           461          81063            0 pilih do.object_name,row_wait_obj#, row_wait_file #, row_wait_block#, row_wait_row#,dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )dari v$session s, dba_objects dowhere =WAID_OBJECT#dan lakukan .;OBJECT_WAIDs. OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C------------- -------------- ----------- ---- ------------- ------------------J21488781           461          81063            0 ABR+SNAHNAAATynAAA SQL> Pilih * dari j tempat rowid =' ABR+SNAHNAAATynAAA';

Artikel terkait

Cara kerja penguncian Oracle
Cara menemukan detail sesi di database Oracle
Pemeriksaan Kesehatan Database Penting
pertanyaan wawancara dba aplikasi oracle
Permintaan untuk memeriksa kunci di database oracle
oracle dba pertanyaan wawancara

Kursus  yang Direkomendasikan

Berikut ini adalah beberapa kursus yang direkomendasikan yang dapat Anda beli jika Anda ingin melangkah lebih jauh

Diberikan di bawah ini adalah tautan ke beberapa kursus


Oracle DBA 11g/12c – Administrasi Database untuk DBA Junior :Kursus ini baik untuk orang-orang yang memulai sebagai DBA Junior atau bercita-cita menjadi Oracle DBA. Ini akan memberikan pemahaman yang baik tentang pencadangan &pemulihan dan tugas administrasi Umum
Oracle Database:Oracle 12C R2 RAC Administration :Kursus ini mencakup instalasi, administrasi Oracle RAC. Kursus yang bagus untuk Oracle DBA yang ingin meningkatkan keterampilannya untuk Oracle RAC
Oracle Data Guard:Administrasi Database untuk Oracle 12C R2 :Kursus ini mencakup instalasi, administrasi Oracle Dataguard. Kursus yang bagus untuk Oracle DBA yang ingin meningkatkan keterampilannya untuk Oracle Dataguard


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah saya perlu membuat indeks pada kunci asing di Oracle?

  2. Hash bergabung di Oracle dengan contoh

  3. Hibernasi pembuatan kunci otomatis dengan MySQL dan Oracle

  4. Penggabungan String Agregat di Oracle 10g

  5. Bagaimana saya bisa memasukkan banyak baris ke Oracle dengan nilai urutan?