2009-08-19 15 views
25

मैं यह पता लगाने के लिए एक तरीका ढूंढ रहा हूं कि वर्तमान सत्र में असामान्य INSERT, अद्यतन या हटाएं कथन हैं या नहीं। एक तरीका मौजूदा सिड के साथ वी $ लॉक की जांच करना होगा, लेकिन इसके लिए वी $ लॉक तक पढ़ने की आवश्यकता है, जो डीबीए इसे प्रदान नहीं करना चाहता है, जो एक समस्या है। कोई अन्य तरीका (आवेदन द्वारा जारी सभी डेटाबेस आदेशों का ट्रैक रखने के अलावा)?ओरेकल: लेनदेन लंबित होने पर कैसे पता लगाना है?

+0

मुझे लगता है कि किसी भी वी $ विचारों तक पहुंच नहीं है। – Gren

+0

संभावित डुप्लिकेट [मैं कैसे बता सकता हूं कि मेरे पास ओरेकल लेनदेन में असामान्य काम है या नहीं?] (Http://stackoverflow.com/questions/506456/how-can-i-tell-if-i-have-uncommitted-work -इन-ए-ऑरैक-लेनदेन) –

उत्तर

34

आप देख सकते हैं कि आपका सत्र V$TRANSACTION में एक पंक्ति (जाहिर है, यह दृश्य पर पढ़ा विशेषाधिकार की आवश्यकता है) है:

SQL> SELECT COUNT(*) 
    2 FROM v$transaction t, v$session s, v$mystat m 
    3 WHERE t.ses_addr = s.saddr 
    4  AND s.sid = m.sid 
    5  AND ROWNUM = 1; 

    COUNT(*) 
---------- 
     0 

SQL> insert into a values (1); 

1 row inserted 

SQL> SELECT COUNT(*) 
    2 FROM v$transaction t, v$session s, v$mystat m 
    3 WHERE t.ses_addr = s.saddr 
    4  AND s.sid = m.sid 
    5  AND ROWNUM = 1; 

    COUNT(*) 
---------- 
     1 

SQL> commit; 

Commit complete 

SQL> SELECT COUNT(*) 
    2 FROM v$transaction t, v$session s, v$mystat m 
    3 WHERE t.ses_addr = s.saddr 
    4  AND s.sid = m.sid 
    5  AND ROWNUM = 1; 

    COUNT(*) 
---------- 
     0 
+0

ऐसे मामले हैं जहां यह विधि काम नहीं करती है, झूठी सकारात्मक प्रतिक्रियाएं: उदाहरण के लिए यदि आप डेटाबेस लिंक का उपयोग कर रिमोट डेटाबेस से डेटा का चयन करते हैं (रीमोटेटेबल @ डाटाबेसेलिंक से * चुनें * ऑरैकल यदि आपने कोई डेटा नहीं बदला है तो भी एक लेनदेन शुरू करें। यह विधि गारंटी नहीं देती है कि आपके पास असामान्य डेटा है। ... क्या आप इस तरह के लेनदेन को फ़िल्टर करने के लिए इस क्वेरी को बेहतर बनाने के किसी भी तरीके से जानते हैं? यह वास्तव में मुझे पहेली करता है। –

+0

@ करलोसिना हां ऐसे मामले हैं जहां ओरेकल लेनदेन शुरू करेगा भले ही आप डेटा में बदलाव न करें। रिमोट डेटाबेस से कनेक्ट करना एक उदाहरण है (उदाहरण के लिए देखें [Asktom पर यह धागा] (https://asktom.oracle.com/pls/asktom/f?p=100:11TP:::P11_QUESTION_ID:8908307196113))। एक सरल 'चयन करें ...अद्यतन के लिए डेटा को संशोधित किए बिना लेनदेन शुरू भी करेगा। मेरे उत्तर में वर्णित विधि बताती है कि क्या आपके पास एक लेनदेन लंबित है, भले ही आपके पास असामान्य डेटा न हो। दोनों बराबर नहीं हैं (डेटा संशोधित करना पर्याप्त है, लेकिन लेनदेन शुरू करने के लिए आवश्यक नहीं है)। –

21

यह क्वेरी है जिसका मैं सामान्य रूप से उपयोग करता हूं,

select s.sid 
     ,s.serial# 
     ,s.username 
     ,s.machine 
     ,s.status 
     ,s.lockwait 
     ,t.used_ublk 
     ,t.used_urec 
     ,t.start_time 
from v$transaction t 
inner join v$session s on t.addr = s.taddr; 
+1

बहुत अच्छी तरह से काम करता है, मुझे भी निष्क्रिय प्रणाली हत्या सत्र 'धारावाहिक #' के साथ निष्क्रिय लेनदेन को मारने की आवश्यकता है; – Diizzy

2

लंबित लेनदेन को जानने के लिए नीचे दी गई क्वेरी का उपयोग करें।

यदि यह एक मूल्य देता है, तो इसका मतलब है कि लंबित लेनदेन है।

क्वेरी है:

select dbms_transaction.step_id from dual;

संदर्भ:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.html http://www.acehints.com/p/site-map.html

+0

एक सेट ट्रांज़ेक्शन करें और फिर अपनी क्वेरी चलाएं। –

0

मैथ्यू वाटसन आरएसी

select t.inst_id 
     ,s.sid 
     ,s.serial# 
     ,s.username 
     ,s.machine 
     ,s.status 
     ,s.lockwait 
     ,t.used_ublk 
     ,t.used_urec 
     ,t.start_time 
from gv$transaction t 
inner join gv$session s on t.addr = s.taddr; 
1

सबसे आसान और विश्वसनीय समाधान कोशिश करते हैं और एक सौदे शुरू करने और यह देखने के लिए है में इस्तेमाल किया जा करने के लिए संशोधित किया जा सकता है अगर सफल होता है। अगर कुछ कोड पहले ही एक लेनदेन शुरू कर चुके हैं लेकिन अभी तक कोई डीएमएल जारी नहीं किया है, तो वी $ ट्रान्सएक्शन व्यू कुछ भी नहीं दिखाएगा।

नीचे दिए गए उदाहरण में, मैं उपयोगकर्ता द्वारा परिभाषित अनुप्रयोग त्रुटि को बढ़ाने के लिए अपवाद को संभालता हूं। मौजूदा अपवाद हैंडलर को स्थगित करने के लिए, बस एक सेट ट्रांज़ेक्शन करें और फिर इसे पूर्ववत करने के लिए तत्काल COMMIT करें।

DECLARE 
    transaction_in_progress EXCEPTION; 
    PRAGMA EXCEPTION_INIT(transaction_in_progress, -1453); 
BEGIN 
    SET TRANSACTION NAME 'CHECK_FOR_TRANSACTION_ALREADY_SET'; 
    COMMIT; -- end transaction 
EXCEPTION 
    WHEN transaction_in_progress THEN 
     RAISE_APPLICATION_ERROR(-20000,'Transaction is already in progress'); 
END; 
/
संबंधित मुद्दे