2015-09-09 6 views
17

मैं लैरवेल 5.1 का उपयोग कर रहा हूं।लैरवेल कतारों का उपयोग करते समय नौकरियों से बचने के लिए डीबी टेबल ताले मुद्दे कैसे?

कतारों का उपयोग कई प्रणालियों के बीच डेटा लाने/समन्वयन के लिए किया जाता है।

मैं डेटाबेस ड्राइवर का उपयोग करता हूं, 3 "कारीगर कतार: कार्य - डिमन" प्रक्रियाएं हर समय चल रही हैं।

नौकरियां सिस्टम उपयोगकर्ताओं और शेड्यूलर (क्रॉन) दोनों द्वारा भेजी जाती हैं। नौकरियों को प्राथमिकता देने के लिए तीन कतारों का उपयोग किया जाता है।

सबकुछ ठीक काम करने लगता है - नौकरियां तालिका रिकॉर्ड से भर जाती है, सिस्टम उनका ख्याल रखता है और किए गए लोगों को हटा देता है।

हालांकि कुछ समय के बाद ताला लगा मुद्दों हस्तक्षेप करने के लिए शुरू कर रहे हैं:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

और

'RuntimeException' with message 'Can't swap PDO instance while within transaction.'

और

SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction

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

क्या इस मुद्दे को हल करने का कोई तरीका है? आपके क्या विचार हैं?

यह उल्लेखनीय हो सकता है कि मैं अपने नौकरी कक्षाओं के अंदर DB::reconnect() पर कॉल करता हूं क्योंकि कतार श्रमिक डेमॉन के रूप में चल रहे हैं।

नौकरियों को DispatchesJobs विशेषता का उपयोग करके प्रेषित किया जाता है जैसा कि कोई उम्मीद करेगा। मैं किसी भी अन्य तरीके से कतार एल्गोरिदम में हस्तक्षेप नहीं करता हूं।

+0

इस के लिए कोई समाधान? –

+1

नहीं। अब के लिए beanstalkd के लिए ले जाया गया। हालांकि मुझे डीबी ड्राइवर बेहतर पसंद आया क्योंकि मैं नौकरियों को ट्रैक कर सकता था और डीबी टेबल को देखकर नौकरियों में असफल रहा ... – MaGnetas

+0

अध्ययन करें कि लैरावेल माईएसक्यूएल के "लेन-देन" से कैसे निपटता है। ऐसा लगता है कि आपने एक लेनदेन शुरू कर दिया है, फिर लंबे समय तक बैठ गया। व्यावहारिक के रूप में जल्द ही 'COMMIT' लेनदेन। 'Autocommit' के उपयोग की जांच करें। –

उत्तर

0

आप MyISAM पर स्विच कर सकते हैं और इससे लेनदेन त्रुटियों को हटा दिया जाएगा; लेकिन साथ ही आप innoDB के साथ आने वाली बहुत अच्छी कार्यक्षमता और विश्वसनीयता खो देंगे।

* यह एक विकल्प है, तो टेबल विदेशी कुंजी है और आप इस तरह के व्यापक हटाए गए और अद्यतन के रूप में चीजें हैं जो केवल InnoDB

+1

पसंद करूंगा, मुझे लगता है कि इस मामले में विदेशी कुंजी कोई समस्या नहीं है। तालिका में कोई संबंध नहीं है। और "नौकरियां" तालिका बनाने का प्रवास इंजन को निर्दिष्ट नहीं करता है। यह वास्तव में समाधान हो सकता है। हालांकि लेनदेन नहीं होने का मतलब टकराव हो सकता है जो मुश्किल से ट्रैक करने योग्य हैं ... – MaGnetas

1

में पाए जाते हैं इस उत्तर लेकिन कुछ जानकारी नहीं हो सकता है पर निर्भर कर रहे हैं नहीं है।

SELECT ... FOR UPDATE कथन का उपयोग करते समय, आप लॉक विवाद (मृत ताले आदि) का उपयोग कर सकते हैं।

select … for update where x <= y 

अपने सभी पंक्तियों < = डेटाबेस ताले के साथ स्कैन सीमा कि < = कोई अंतर इसलिए यदि आप इस तरह y के साथ पंक्तियों सहित y,: 1, 3, 5 तो यह और भी खाली जगह ताले 1 और सूचकांक में 3 के बीच अपनी बुलाया खाई

ताला लगा इस आदेश के साथ इस मुद्दे को देख सकते हैं:

SHOW ENGINE INNODB STATUS; 

---TRANSACTION 72C, ACTIVE 755 sec 
4 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1 
MySQL thread id 3, OS thread handle 0x7f84a78ba700, query id 163 localhost msandbox 
TABLE LOCK table test.t trx id 72C lock mode IX 
RECORD LOCKS space id 19 page no 4 n bits 80 index age of table test.t trx id 72C lock_mode X 
RECORD LOCKS space id 19 page no 3 n bits 80 index GEN_CLUST_INDEX of table test.t trx id 72C lock_mode X locks rec but not gap 
RECORD LOCKS space id 19 page no 4 n bits 80 index age of table test.t trx id 72C lock_mode X locks gap before rec 

अंतिम पंक्ति

यदि आप अंतराल के बहुत संगामिति और प्रदर्शन आप उन्हें दो अलग अलग तरीकों से निष्क्रिय कर सकते हैं को प्रभावित करने वाले अपने लेन-देन में ताले है:

1- Change the ISOLATION level to READ COMMITTED. In this isolation level, it is normal and expected that query results can change during a transaction, so there is no need to create locks to prevent that from happening. 

2- innodb_locks_unsafe_for_binlog = 1. Disables the gap locks except for foreign-key constraint checking or duplicate-key checking. 

https://www.percona.com/blog/2012/03/27/innodbs-gap-locks/

+0

यह सब सहायक हो सकता है, धन्यवाद। लेकिन मैं वास्तव में लार्वेल कोर के साथ गड़बड़ से नफरत करता हूं। मेरा मानना ​​है कि इसे किसी भी तरह से "बॉक्स से बाहर" हल किया जाना चाहिए। हालांकि मैं इस मुद्दे से बचने के लिए अपने कोड या वर्कफ़्लो में कुछ "अच्छा अभ्यास" परिवर्तन कर सकता था। – MaGnetas

संबंधित मुद्दे

 संबंधित मुद्दे