Oracle - Adakah cara untuk melihat perubahan yang tidak dikomit ke tabel tertentu?

24

Saya sedang debugging melalui proses batch saat ini yang melakukan banyak pernyataan DML, tetapi tidak langsung melakukan komit. Alangkah baiknya untuk dapat melihat perubahan "yang tertunda" dari sesi lain saat transaksi tidak dilakukan. Apakah ini mungkin?

Contoh:

Insert into table myTable (col1, col2) values ("col1", "col2");

--Somehow view the pending transaction maybe by system view?....

...other DML statements....

commit;
contactmatt
sumber
Ada lebih dari satu cara untuk melakukannya. Sebagai contoh, pernyataan SQL di sini dapat menyelesaikan: ducquoc.wordpress.com/2012/07/14/oracle-uncommited-changes good luck,

Jawaban:

18

Ada beberapa pendekatan berbeda tergantung pada detail proses batch Anda dan mengapa Anda mencoba melihat perubahan yang tidak dikomit.

1) Oracle Workspace Manager adalah alat yang awalnya dirancang untuk memungkinkan orang mengembangkan aplikasi Spatial untuk memiliki setara dengan transaksi yang sangat lama berjalan (yaitu transaksi yang mungkin memerlukan beberapa hari atau minggu manusia mencari tahu di mana harus menjalankan pipa dalam satu transaksi ). Proses batch Anda dapat membuat ruang kerja baru (yang secara logis seperti membuat transaksi baru), membuat perubahan apa pun yang diinginkan di ruang kerja itu sambil melakukan kapan pun diinginkan. Dalam sesi terpisah, Anda tidak akan melihat perubahan yang dilakukan sampai Anda memasuki ruang kerja proses batch. Ketika proses batch selesai, itu bisa menggabungkan ruang kerjanya kembali ke ruang kerja langsung yang setara dengan melakukan transaksi.

2) Paket DBMS_XA dapat digunakan untuk memungkinkan Anda "menyerahkan" transaksi dari satu sesi ke sesi lainnya dan untuk memungkinkan satu sesi untuk terhubung ke transaksi yang dimulai oleh sesi lain. Ini adalah paket yang cukup tidak jelas untuk digunakan, tetapi ada contoh yang bagus untuk menggunakannya dalam PL / SQL Challenge (Anda mungkin perlu akun gratis untuk mengaksesnya) baru-baru ini.

3) Jika Anda hanya mencoba melihat status proses batch daripada melihat data aktual, proses batch dapat menulis informasi logging menggunakan transaksi otonom yang kemudian dapat Anda query dari sesi lain. Atau Anda dapat menggunakan paket DBMS_APPLICATION_INFO untuk meminta aplikasi Anda memperbarui berbagai atribut dalam V $ SESSION dan / atau V $ SESSION_LONGOPS sehingga Anda dapat memantau status beban dari sesi lain.

Gua Justin
sumber
10

sunting: ini ditulis sebelum pertanyaannya diklarifikasi

Anda bisa menggunakan kueri kilas balik untuk melihat tabel tanpa data yang tidak dikomit sendiri .

Mempertimbangkan:

SQL> CREATE TABLE my_table
  2  AS SELECT ROWNUM ID FROM dual CONNECT BY LEVEL <= 5;

Table created

SQL> INSERT INTO my_table VALUES (6);

1 row inserted

Untuk melihat perbedaan antara tabel dengan transaksi saya dan tabel seperti yang terlihat oleh orang lain, saya dapat menerbitkan:

SQL> SELECT * FROM my_table
  2  MINUS
  3  SELECT * FROM my_table AS OF TIMESTAMP (systimestamp);

        ID
----------
         6
Vincent Malgrat
sumber
2
@jack: tidak jelas apakah OP ingin melihat data yang tidak dikomit di luar sesi (skrip semu bisa dalam satu sesi). Jawaban saya hanya akan berfungsi untuk melihat modifikasi yang tertunda pada tabel.
Vincent Malgrat
kamu benar, maaf Jawaban yang bagus
Jack Douglas
8

Ya - LogMiner dapat melakukan ini. Bahkan, jika Anda hanya ingin melakukan transaksi, Anda harus memfilter output secara spesifik ! Dan ada TABLE_NAMEdi V$LOGMINER_CONTENTS, itulah bagaimana Anda akan melihat satu meja.

Gayus
sumber
8

Apa yang tidak dimiliki Oracle adalah mode isolasi tanpa komitmen baca . Dengan kata lain Anda tidak akan dapat meminta data yang tidak dikomit dalam transaksi lain.

Ada cara untuk mendapatkan informasi dari transaksi yang berjalan lama - yang tidak disebutkan sejauh ini adalah transaksi otonom (yang harus digunakan dengan hati-hati)

Jack Douglas
sumber
5

Tidak ada metode langsung; Anda harus memilah-milah log (seperti yang disebutkan dalam jawaban lain), atau menggunakan metode alternatif untuk melihat apa yang terjadi dalam proses jangka panjang.

Secara pribadi, saya sarankan menggunakan transaksi otonom untuk mengaktifkan fitur ini - bukan pada transaksi itu sendiri, tetapi sebagai mekanisme pencatatan yang memberi tahu Anda apa yang sedang terjadi. Misalnya, Anda bisa meminta PROSEDUR LONG_ACTION memanggil PROCEDURE WRITE_LOG_ENTRY (didefinisikan sebagai transaksi mandiri) yang akan menulis VARCHAR2 ke tabel lain. Transaksi otonom TIDAK mengganggu transaksi Anda saat ini (dari perspektif LOGICAL; waspadai dampak potensial terhadap kinerja) dan sehingga Anda dapat melihat apa yang terjadi melalui entri logging Anda terlepas dari KOMIT atau ROLLBACK dalam transaksi Anda saat ini. Yang mengatakan, Anda bisa melakukannya dengan satu pernyataan DML besar; Anda harus menggunakan loop.

Mempertimbangkan:

TABLE LOG_ENTRIES defined as
    activity_date  date,
    log_entry varchar2(2000)

TABLE BIG_JOB (definition doesn't really matter)

PROCEDURE WRITE_LOG_ENTRY
                        ( str VARCHAR2 )
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO LOG_ENTRIES VALUES ( SYSDATE, str );
    COMMIT;
END;

PROCEDURE LONG_ACTION IS
    c NUMBER;
BEGIN
    FOR r IN ( SELECT * FROM BIG_JOB )
    LOOP
       c := c + 1;
       UPDATE BIG_JOB z
          SET fld = hairy_calculation
        WHERE z.rowid = r.rowid;
       IF MOD(c,500) = 0 THEN
           WRITE_LOG_ENTRY ( c || ' rows processed.' );
       END IF;
    END LOOP;
    COMMIT;
END;

Dengan diberikan di atas, Anda akan mendapatkan entri log untuk setiap 500 baris yang diproses terlepas dari keberhasilan tindakan panjang. Jika Anda membutuhkan duplikat data yang tepat untuk melihatnya saat berfungsi, saya sarankan membuat tabel duplikat dan memanggil prosedur yang akan menggandakan data (prosedur menjadi transaksi mandiri). Kemudian nuke data setelah fakta. (Tidak perlu duplikasi.)

Lebih lanjut, jika ini untuk tujuan debugging, saya sarankan menghapus atau secara drastis mengurangi kebutuhan untuk logging tersebut ketika hal-hal telah diuji. Dan, seperti biasa, uji, uji, uji pada sistem Anda sendiri untuk memverifikasi cara kerja. (Lihat komentar dari Niall untuk contoh yang baik tentang bagaimana logging dapat secara drastis mempengaruhi kinerja.)

(Akhirnya, karena saya lalai menyebutkannya sebelumnya: waspadalah terhadap transaksi otonom. Pahami sepenuhnya sebelum penerapan, dan jangan menggunakannya "hanya karena". Mereka dapat digunakan dalam sejuta cara secara tidak benar (misalnya, misalnya, untuk meminta ATTEMPT untuk hindari kesalahan mutasi pada pemicu), jadi selalu yang terbaik untuk menemukan alternatif, jika mungkin. Jika Anda tidak bisa, maka lanjutkan dengan hati-hati. Logging selama operasi yang berjalan lama selalu menjadi satu kasus di mana itu cukup aman (mengabaikan masalah kinerja), tetapi jangan buru-buru menerapkannya untuk penggunaan lain tanpa mengetahui konsekuensinya.)

Kerri Shotts
sumber
1
Peringatan pada akhir saran ini dieksplorasi lebih lanjut dalam respons panjang saya (dengan kode) di orawin.info/blog/2011/09/06/advice-from-the-internet . Singkatnya, mengadopsi pendekatan ini dapat secara serius dan merugikan mempengaruhi kode yang sudah lambat.
Niall Litchfield
1
@Niall Litchfield, Seperti biasa, ketika menerima saran dari internet, kita harus selalu menguji, menguji, menguji. Ketika disebutkan bahwa transaksi otonom tidak memengaruhi transaksi, saya merujuk pada fakta bahwa transaksi tersebut bukan KOMIT atau ROLL KEMBALI transaksi Anda saat ini; karena itu dalam arti LOGIS, itu tidak melakukan apa pun untuk transaksi Anda saat ini. Ya, tentu saja, Oracle telah melakukan hal-hal di belakang layar untuk membuat hal-hal berfungsi, yang dapat berarti masalah kinerja, dari sudut pandang hanya transaksi, transaksi otonom tidak menghalangi jalannya transaksi saya saat ini.
Kerri Shotts
@Niall Litchfield, Semua yang mengatakan, transaksi otonom memiliki masalah mereka sendiri yang adil (salah satunya adalah orang-orang mencoba menggunakannya untuk berkeliling meja bermutasi), dan jadi saya merekomendasikan mereka dengan hemat dan dengan hati-hati, dan HANYA dengan memahami apa yang terjadi.
Kerri Shotts
3

Tidak tersedia dalam 10g, tetapi DBMS_XA dapat memungkinkan transaksi untuk melewati beberapa sesi. Dengan menggunakan itu, sesi kedua dapat melihat apa yang terjadi dalam transaksi

Gary
sumber
3

Selain informasi lain di sini, beberapa cara tambahan untuk mengirim informasi tentang transaksi yang tidak dikomit adalah mengirim email atau menulis ke file teks.

Leigh Riffel
sumber