मैं यह कैसे सुनिश्चित कर सकता हूं कि ओरेकल में एक प्रक्रिया की केवल एक प्रति चल रही है?


10

हमें यह सुनिश्चित करने की आवश्यकता है कि ओरेकल में किसी विशेष प्रक्रिया की केवल एक प्रति चल रही है। यदि यह पहले से चल रहा है और एक उपयोगकर्ता दूसरे को खोलने की कोशिश करता है, तो उसे त्रुटि करनी चाहिए।

ऐसा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


12

आप ऐसा कर सकते हैं DBMS_LOCKऔर एक विशेष ताला।

निम्नलिखित प्रक्रिया देखें:

CREATE OR REPLACE PROCEDURE myproc
IS
  lockhandle VARCHAR2(128);
  retcode NUMBER;
BEGIN
  DBMS_LOCK.ALLOCATE_UNIQUE('myproclock',lockhandle);

  retcode:=DBMS_LOCK.REQUEST(lockhandle,timeout=>0, lockmode=>DBMS_LOCK.x_mode);

  IF retcode<>0
  THEN
    raise_application_error(-20000,'myproc is already running');
  END IF;

  /* sleep so that we can test with a 2nd execution */
  DBMS_LOCK.sleep(1000);

  retcode:=DBMS_LOCK.RELEASE(lockhandle);

END myproc;
/

टेस्ट (सत्र 1):

SQL> BEGIN
  2  myproc();
  3  END;
  4  /

(स्पष्ट रूप से जब DBMS_LOCK.sleep()रिटर्न देता है)।

टेस्ट (सत्र 2):

SQL> BEGIN
  2  myproc();
  3  END;
  4  /
BEGIN
*
ERROR at line 1:
ORA-20000: myproc is already running
ORA-06512: at "PHIL.MYPROC", line 12
ORA-06512: at line 2


SQL>

जाहिर है आप की जरूरत है GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;


2

'लॉक' तालिका का उपयोग करें।

जब प्रक्रिया एक ज्ञात मूल्य के लिए तालिका की जांच करना शुरू करती है, यदि वर्तमान में आगे नहीं निकलती है और खरीद से बाहर निकलती है। यदि वहाँ नहीं है, तो तालिका में मान लिखें, प्रक्रिया निष्पादित करें, फिर मान हटाएं और सामान्य रूप से बाहर निकलें।


यह कई प्रणालियों के लिए एक अच्छा समाधान है, लेकिन इस विशेष मामले में फिल का सूट बेहतर है, मुझे लगता है।
dezso

1

जब मेरे ग्राहकों से अनुरोध है कि इस तरह का अनोखा व्यावसायिक तर्क है, तो मैं सवाल को घुमाकर पूछ रहा हूं कि इसकी आवश्यकता क्यों है।

यह सुनिश्चित करने का सबसे अच्छा तरीका है कि केवल एक प्रति चल रही है, उपयोगकर्ताओं को प्रक्रिया पर बिल्कुल भी अमल नहीं करने देना है। यदि यह प्रक्रिया इतनी विशेष है तो इसका उपयोग dba / Developers के लिए प्रतिबंधित होना चाहिए।

दूसरा तरीका केवल इस प्रक्रिया को नौकरी के रूप में चलाना है। यह देखने के लिए कि क्या कोई कॉलिंग जॉब चल रही है, प्रक्रिया में एक चेक जोड़ें। यदि वे फिर आगे की प्रक्रिया को रोकते हैं और घटना को लॉग करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.