উত্তর:
আপনি এটি 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;
।
একটি 'লক' টেবিল ব্যবহার করুন।
প্রক্রিয়াটি যখন একটি পরিচিত মানের জন্য টেবিলটি পরীক্ষা করে শুরু করে, যদি উপস্থিত থাকে তবে আর এগিয়ে না যান এবং প্র্যাকটি প্রস্থান করুন। যদি সেখানে না থাকে, টেবিলে মান লিখুন, পদ্ধতিটি কার্যকর করুন, তারপরে মানটি মুছুন এবং স্বাভাবিক হিসাবে প্রস্থান করুন।
যখন আমার ক্লায়েন্টদের কাছে অনুরোধ রয়েছে যাতে এর মতো অনন্য ব্যবসায়িক যুক্তি রয়েছে আমি প্রশ্নটি ঘুরিয়ে দেওয়ার এবং কেন এটি প্রয়োজন তা জিজ্ঞাসা করার চেষ্টা করি।
কেবলমাত্র একটি অনুলিপি চলছে তা নিশ্চিত করার সর্বোত্তম উপায় হ'ল ব্যবহারকারীদের প্রক্রিয়াটি মোটেও কার্যকর করা না দেওয়া। যদি এই পদ্ধতিটি বিশেষ হয় তবে এর ব্যবহারটি ডিবিএ / বিকাশকারীদের মধ্যে সীমাবদ্ধ করা উচিত।
আরেকটি উপায় হ'ল এই প্রক্রিয়াটি কেবল একটি কাজ হিসাবে চালানো। এটিকে কল করে কোনও কাজ চলছে কিনা তা জানতে পদ্ধতিতে একটি চেক যুক্ত করুন। যদি সেগুলি হয় তবে আরও প্রক্রিয়া বন্ধ করুন এবং উপস্থিতিটি লগ করুন।