Rumah > pangkalan data > Oracle > teks badan

kunci paparan oracle dan sql pelaksanaan sesi (perkongsian ringkasan)

WBOY
Lepaskan: 2022-07-01 12:23:15
ke hadapan
3581 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang Oracle, yang terutamanya memperkenalkan isu yang berkaitan dengan menyemak kunci dan sql dalam pelaksanaan sesi Mari kita lihat bersama-sama. .

kunci paparan oracle dan sql pelaksanaan sesi (perkongsian ringkasan)

Tutorial yang disyorkan: "Tutorial Video Oracle"

Persekitaran pangkalan data untuk data ujian dalam artikel ini: Oracle 11g

Mengapa dikatakan bahawa ia adalah sql dalam pelaksanaan sesi Nampaknya rekod pelaksanaan sql sesi tertentu Saya juga telah membaca banyak catatan di Internet katakan bahawa sql_id dikaitkan dengan paparan v$active_session_history dan v$sqlarea Anda boleh menanyakan rekod pelaksanaan sql sesi tertentu Selepas latihan, saya mendapati ia tidak berfungsi (saya mencubanya jadual dba_hist_active_sess_history tetapi ia juga tidak berfungsi) sql_id bagi sesetengah sql tidak direkodkan sama sekali dalam v$active_session_history. Saya menyemaknya dan mendapati bahawa nilai parameter adalah normal dan pangkalan data parameter dibuka Rujuk catatan blog: Pertanyaan Oracle V$ACTIVE_SESSION_HISTORY tidak mempunyai data - wazz_s - Blog Park

Rekod pelaksanaan bagi. sql boleh disoal melalui pandangan v$sqlarea, tetapi sessionid yang melaksanakan sql tidak dapat dijumpai.

Jika saya ingin menanyakan sql yang menyebabkan jadual dikunci, kebanyakan catatan blog di Internet mengajar ini saya mendapat nilai medan prev_sql_addr yang sepadan dengan menanyakan paparan v $session, yang direkodkan sebagai Nilai A, dan kemudian gunakan nilai A sebagai nilai keadaan pertanyaan bagi alamat medan pandangan v$sqlarea, dan kemudian rekod SQL yang sepadan boleh disoal. Sebagai ujian amalan, anda boleh menemui SQL yang mencari jadual kunci, tetapi dalam kebanyakan kes anda tidak boleh mendapatkannya dalam persekitaran pengeluaran biasa Mengapa?

Artikel ini menggunakan pendekatan penerokaan untuk mengkaji untuk memastikan ketepatan data, saya membuka tiga sesi pangkalan data, direkodkan sebagai sesi1, sesi2 dan sesi3 seperti berikut:

1 Cipta jadual ujian dan data ujian baharu dalam sesi sesi1

--新建测试表
create table zxy_table(zxy_id int,zxy_name varchar2(20));
--插入数据
insert into zxy_table(zxy_id,zxy_name) values(1,'zxy1');
insert into zxy_table(zxy_id,zxy_name) values(2,'zxy2');
insert into zxy_table(zxy_id,zxy_name) values(3,'zxy3');
insert into zxy_table(zxy_id,zxy_name) values(4,'zxy4');
commit;
Salin selepas log masuk
2 Lihat ID sesi daripada sesi1

 select userenv('sid') from dual;
Salin selepas log masuk

Anda boleh melihat bahawa ID sesi ialah 2546

3 Dalam sesi1, kunci baris jadual zxy_table melalui pilih untuk kemas kini , seperti berikut:

 select * from zxy_table where zxy_name='zxy1' for update;
Salin selepas log masuk
4 Dalam sesi2, tanya id sesi sebagai 2189:

Kemudian dalam sesi2, semak baris jadual zxy_table dengan value zxy_name='zxy1' Kemas kini, seperti berikut:

update zxy_table set zxy_name='zxy1_modify' where zxy_name='zxy1';
Salin selepas log masuk
Kemudian kita lihat bahawa sql telah disekat, seperti yang ditunjukkan di bawah:

5 Kemudian kita datang ke session3 untuk melihat Situasi meja terkunci

Mula-mula semak jadual v$locked_object

select * from v$locked_object;
Salin selepas log masuk

Anda boleh melihat bahawa sesi id yang menyebabkan jadual terkunci ialah 2546, iaitu satu sesi1 sebelumnya, dan object_id ialah 110154. Sudah tentu, dalam persekitaran penjanaan, anda pasti akan melihat lebih daripada satu rekod Anda perlu melaksanakannya beberapa kali lagi melaksanakan n kali, anda masih boleh melihat rekod, yang membuktikan bahawa rekod ini ialah jadual kunci

Pertanyaan melalui object_id: 110154

dba4_objects table Pertanyaan maklumat jadual kunci terperinci <.>

select object_name as 被锁的表名称,obj.* from dba_objects obj where object_id='110154';
Salin selepas log masuk

Pertanyaan melalui sessionid: 2546 Paparan v$session

select 
       s.prev_sql_addr,
       module as 客户端工具名称,
       s.user# as 数据库账号名,
       s.osuser as 连接数据库客户端对应的window账号名称,
       s.machine as 连接数据库客户端对应的计算机名称,
       s.* 
from v$session s where sid='2546';
Salin selepas log masuk
Salin selepas log masuk

mendapat nilai prev_sql_addr: 00000000 dan kemudian menanyakan pandangan v$sqlarea

select * from v$sqlarea where address='000000012E045E28';
Salin selepas log masuk

Daripada gambar di atas, anda boleh melihat kenyataan yang menyebabkan jadual dikunci, tetapi banyak catatan blog telah selesai pada langkah ini. Adakah pertanyaan ini benar-benar boleh dipercayai? Jawapannya tidak boleh dipercayai. Anda boleh kembali ke session1 dan laksanakan sql sesuka hati, seperti berikut:

Kemudian anda boleh pergi ke session3 untuk melaksanakan
 select * from zxy_table;
Salin selepas log masuk

select 
       s.prev_sql_addr,
       module as 客户端工具名称,
       s.user# as 数据库账号名,
       s.osuser as 连接数据库客户端对应的window账号名称,
       s.machine as 连接数据库客户端对应的计算机名称,
       s.* 
from v$session s where sid='2546';
Salin selepas log masuk
Salin selepas log masuk

 再看看prev_sql_addr是不是变了,从000000012E045E28变为了00000001FB03CEC0,再通过00000001FB03CEC0查询视图v$sqlarea

select * from v$sqlarea where address='00000001FB03CEC0';
Salin selepas log masuk

得到的sql_text是select * from zxy_table,你敢说这条sql导致了锁表吗?所有只能说是session1当前执行的sql,而且你很难保证session1执行完锁表的sql: select * from zxy_table where zxy_name='zxy1' for update且在提交前不再执行别的sql,这就是前文提出的问题的答案。

推荐教程:《Oracle视频教程

Atas ialah kandungan terperinci kunci paparan oracle dan sql pelaksanaan sesi (perkongsian ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!