কীভাবে আমি নিশ্চিত করতে পারি যে ওরাকলে কোনও পদ্ধতির কেবল একটি অনুলিপি চলছে?


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

যখন আমার ক্লায়েন্টদের কাছে অনুরোধ রয়েছে যাতে এর মতো অনন্য ব্যবসায়িক যুক্তি রয়েছে আমি প্রশ্নটি ঘুরিয়ে দেওয়ার এবং কেন এটি প্রয়োজন তা জিজ্ঞাসা করার চেষ্টা করি।

কেবলমাত্র একটি অনুলিপি চলছে তা নিশ্চিত করার সর্বোত্তম উপায় হ'ল ব্যবহারকারীদের প্রক্রিয়াটি মোটেও কার্যকর করা না দেওয়া। যদি এই পদ্ধতিটি বিশেষ হয় তবে এর ব্যবহারটি ডিবিএ / বিকাশকারীদের মধ্যে সীমাবদ্ধ করা উচিত।

আরেকটি উপায় হ'ল এই প্রক্রিয়াটি কেবল একটি কাজ হিসাবে চালানো। এটিকে কল করে কোনও কাজ চলছে কিনা তা জানতে পদ্ধতিতে একটি চেক যুক্ত করুন। যদি সেগুলি হয় তবে আরও প্রক্রিয়া বন্ধ করুন এবং উপস্থিতিটি লগ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.