2012-02-02 14 views
7

हैं, तो मुझे यकीन है कि एक प्रक्रिया है एक सर्वर पर प्रारंभ नहीं होता है, तो यह पहले से ही किसी अन्य सर्वर पर चल रहा है बनाने के लिए एक डेटाबेस का उपयोग करना चाहते हैं।सैमफोर प्रबंधित करने के लिए मैं डेटाबेस का उपयोग कैसे करूं? एक ही कोड के कई उदाहरण अलग सर्वर पर चल रहे हैं

मैं शायद आने-अप कर सकता है कुछ व्यावहारिक SQL कमांड कि Oracle लेनदेन प्रसंस्करण के लिए इस्तेमाल किया, latches, या जो कुछ भी है, लेकिन मैं नहीं बल्कि कुछ है कि कोशिश की गई है और सच पाते हैं।

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

संपादित करें:

यहाँ कुछ व्यावहारिक SQL कमांड हो सकता है, लेकिन एक क्रॉन जॉब हैक के माध्यम से छोड़कर कोई समय समाप्त:

--------------------------------------------------------------------- 
--Setup 
--------------------------------------------------------------------- 
CREATE TABLE "JOB_LOCKER" ("JOB_NAME" VARCHAR2(128 BYTE), "LOCKED" VARCHAR2(1 BYTE), "UPDATE_TIME" TIMESTAMP (6)); 
CREATE UNIQUE INDEX "JOB_LOCKER_PK" ON "JOB_LOCKER" ("JOB_NAME") ; 
ALTER TABLE "JOB_LOCKER" ADD CONSTRAINT "JOB_LOCKER_PK" PRIMARY KEY ("JOB_NAME"); 
ALTER TABLE "JOB_LOCKER" MODIFY ("JOB_NAME" NOT NULL ENABLE); 
ALTER TABLE "JOB_LOCKER" MODIFY ("LOCKED" NOT NULL ENABLE); 

insert into job_locker (job_name, locked) values ('myjob','N'); 
commit; 

--------------------------------------------------------------------- 
--Execute at the beginning of the job 
--AUTOCOMMIT MUST BE OFF! 
--------------------------------------------------------------------- 
select * from job_locker where job_name='myjob' and locked = 'N' for update NOWAIT; 
--returns one record if it's ok. Otherwise returns ORA-00054. Any other thread attempting to get the record gets ORA-00054. 
update job_locker set locked = 'Y', update_time = sysdate where job_name = 'myjob'; 
--1 rows updated. Any other thread attempting to get the record gets ORA-00054. 
commit; 
--Any other thread attempting to get the record with locked = 'N' gets zero results. 
--You could have code to pull for that job name and locked = 'Y' and if still zero results, add the record. 

--------------------------------------------------------------------- 
--Execute at the end of the job 
--------------------------------------------------------------------- 
update job_locker set locked = 'N', update_time = sysdate where job_name = 'myjob'; 
--Any other thread attempting to get the record with locked = 'N' gets no results. 
commit; 
--One record returned to any other thread attempting to get the record with locked = 'N'. 

--------------------------------------------------------------------- 
--If the above 'end of the job' fails to run (system crash, etc) 
--The 'locked' entry would need to be changed from 'Y' to 'N' manually 
--You could have a periodic job to look for old timestamps and locked='Y' 
--to clear those. 
--------------------------------------------------------------------- 
+2

मैन्युअल रिकॉर्ड समाप्त हो रही से बचने के लिए आप लॉक एक टाइमस्टैम्प होना हो सकता है। लॉक प्राप्त करने के लिए अब टाइमस्टैम्प सेट करता है। लॉक प्राप्त करने के लिए, लॉक के लिए क्वेरी को एक शर्त जोड़ने की आवश्यकता है जहां लॉकटाइम <(SYSDATE - timeToExpire)। फिर ताले स्वचालित रूप से समाप्त हो जाते हैं। – Glenn

+0

धन्यवाद ग्लेन ... वाई/एन के बजाय टाइमस्टैम्प ऊपर के लिए एक अच्छा जोड़ा है। – Dale

उत्तर

11

आप DBMS_LOCK ध्यान देना चाहिए। मूलतः, यह कतारबद्ध तंत्र ताला लगा कि Oracle आंतरिक रूप से उपयोग करता है, सिवाय इसके कि यह आप 'यूएल' (उपयोगकर्ता ताला) के एक ताला प्रकार को परिभाषित करने की अनुमति देता है के लिए अनुमति देता है। ताले साझा या अनन्य आयोजित किए जा सकते हैं, और लॉक लेने का अनुरोध, या एक मोड से दूसरे मोड में लॉक को बदलने के लिए, टाइमआउट का समर्थन करें।

मुझे लगता है कि तुम क्या चाहते हो जाएगा।

उम्मीद है कि मदद करता है।

+0

मुझे पसंद है कि इसमें एक टाइमआउट है। मैंने पहले कभी डीबीएमएस_एलकेसी का उपयोग नहीं किया है, और मैं वास्तव में एक एसक्यूएल जॉकी नहीं हूं, इसलिए यह काम करने के लिए मेरे लिए एक उग्र लड़ाई हो सकती है, हे। – Dale