Rumah > Artikel > pangkalan data > kunci paparan oracle dan sql pelaksanaan sesi (perkongsian ringkasan)
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. .
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;2 Lihat ID sesi daripada sesi1
select userenv('sid') from dual;Anda boleh melihat bahawa ID sesi ialah 25463 Dalam sesi1, kunci baris jadual zxy_table melalui pilih untuk kemas kini , seperti berikut:
select * from zxy_table where zxy_name='zxy1' for update;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';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;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';
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';
mendapat nilai prev_sql_addr: 00000000 dan kemudian menanyakan pandangan v$sqlarea
select * from v$sqlarea where address='000000012E045E28';
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 melaksanakanselect * from zxy_table;
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';
再看看prev_sql_addr是不是变了,从000000012E045E28变为了00000001FB03CEC0,再通过00000001FB03CEC0查询视图v$sqlarea
select * from v$sqlarea where address='00000001FB03CEC0';
得到的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!