Rumah  >  Artikel  >  pangkalan data  >  Penjelasan grafik dan teks terperinci mengenai penyelesaian jadual kunci Oracle

Penjelasan grafik dan teks terperinci mengenai penyelesaian jadual kunci Oracle

WBOY
WBOYke hadapan
2022-08-17 18:13:513186semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang Oracle Semasa membangunkan pangkalan data Oracle, kami sering menemui jadual data Oracle yang kerap dikendalikan, dan jadual kunci Oracle akan muncul di sini maklumat yang berkaitan tentang penyelesaian jadual kunci Oracle Saya harap ia akan membantu semua orang.

Penjelasan grafik dan teks terperinci mengenai penyelesaian jadual kunci Oracle

Tutorial yang disyorkan: "Tutorial Video Oracle"

Saya percaya semua orang biasa dengan kunci meja atau tamat masa kunci, yang sering berlaku dalam DML Dalam penyata, sebabnya ialah mekanisme penguncian eksklusif pangkalan data Apabila penyataan DML dilaksanakan, data jadual atau baris dikunci sehingga urus niaga dilakukan atau dibatalkan atau sesi semasa ditamatkan secara paksa.

Untuk sistem aplikasi kami, penguncian jadual kemungkinan besar akan berlaku apabila pelaksanaan SQL adalah perlahan dan tiada tamat masa (SQL telah tidak berjaya dilaksanakan atas sebab tertentu (alat Sudu melakukan pengekstrakan dan tolak data) dan telah Jangan lepaskan sumber) Oleh itu, adalah amat penting untuk menulis SQL yang cekap! Terdapat juga situasi lain di mana penguncian jadual mungkin berlaku, yang merupakan senario konkurensi yang tinggi Masalah yang disebabkan oleh konkurensi yang tinggi ialah transaksi Spring akan menyebabkan transaksi pangkalan data tidak komited dan menyebabkan kebuntuan (urus niaga semasa sedang menunggu transaksi lain untuk melepaskan kunci. sumber)! Oleh itu melemparkan pengecualian java.sql.SQLException: Lock tunggu tamat masa melebihi;.

Jadi bagaimana untuk menyelesaikan jadual kunci atau tamat masa kunci? Penyelesaian sementara adalah untuk mengetahui jadual atau pernyataan yang bersaing untuk sumber kunci, secara langsung menamatkan sesi atau sesi semasa dan memaksa keluaran sumber kunci. Contohnya

Penyelesaian adalah seperti berikut:

1 Sesi1 mengubah suai data tertentu tetapi tidak menyerahkan transaksi dan sesi2 menanyakan rekod transaksi yang tidak komited

2. Sesi2 cuba mengubah suai

Kita dapat melihat bahawa rekod mengubah suai transaksi tidak komited akan berada dalam keadaan menunggu sehingga yang lain pihak melepaskan sumber kunci atau menutup sesi1 secara paksa. Ini juga menunjukkan bahawa Oracle telah mencapai kunci peringkat baris!

Ini hanyalah simulasi ringkas situasi kunci meja Ia boleh dilihat secara sepintas lalu bahawa kunci meja disebabkan oleh sesi1. Apabila menghadapi situasi seperti ini dalam pembangunan sebenar, SQL biasanya digunakan untuk mengetahui secara langsung jadual atau pernyataan yang bersaing untuk mendapatkan sumber kunci dan kemudian melepaskan sumber secara paksa! !

3. Sesi3 menanyakan jadual atau pernyataan yang bersaing untuk mendapatkan sumber dan memaksa pengeluaran sumber

-- 查询未提交事务的session信息,注意执行以下SQL,用户需要有DBA权限才行
SELECT
    L.SESSION_ID,
    S.SERIAL#,
    L.LOCKED_MODE AS 锁模式,
    L.ORACLE_USERNAME AS 所有者,
    L.OS_USER_NAME AS 登录系统用户名,
    S.MACHINE AS 系统名,
    S.TERMINAL AS 终端用户名,
    O.OBJECT_NAME AS 被锁表对象名,
    S.LOGON_TIME AS 登录数据库时间
FROM V$LOCKED_OBJECT L
    INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID
    INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID
WHERE 1 = 1
Hasil pertanyaan adalah seperti berikut

Paksa kami Hanya dua medan pertama yang berguna untuk melepaskan sumber Contohnya,

-- 强制 结束/kill 锁表会话语法
ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';

-- 强制杀死session1,让session2可以修改id=5的那条记录
ALTER SYSTEM KILL SESSION '34, 111';
Selepas membunuh secara paksa sesi1, beri perhatian kepada pelaksanaan sesi2! Kami akan mendapati bahawa penantian sesi2 akan ditamatkan dan dilaksanakan serta-merta! Saya percaya semua orang mempunyai keraguan, session_id ialah 29 dan 34, bagaimana untuk menentukan sama ada mereka tergolong dalam session1 atau session2, dan memastikan session1 dimatikan supaya session2 boleh berjaya melaksanakan kenyataan DML?

Malah, ia adalah sangat mudah. ​​Pertimbangan di sini Kaedahnya ialah session1 melakukan kemas kini tetapi tidak menyerahkan transaksi Anda boleh menggunakan SQL di atas untuk menanyakan maklumat sesi transaksi yang tidak dikomitkan sesi1.

Tutorial yang disyorkan: "

Tutorial Video Oracle"

Atas ialah kandungan terperinci Penjelasan grafik dan teks terperinci mengenai penyelesaian jadual kunci Oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam