2015-07-23 15 views
5

मैं इस प्रश्न के साथ MySQL तालिकाओं को लॉक नहीं कर सकते हैं:टेबल Laravel के साथ मुद्दों पर ताला लगा 5.1

[Illuminate\Database\QueryException] 

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: LOCK TABLES imports WRITE)

एक ही त्रुटि तब होती है जब मैं पीडीओ का उपयोग करें:

DB::statement('LOCK TABLES imports WRITE'); 

यह उन अपवाद देता है ।

मुझे इसका उपयोग कैसे करना चाहिए?

+0

'डीबी :: कनेक्शन() -> getPdo() -> setAttribute (PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY, true) आज़माएं;'। – Siper

+0

ठीक है, मैं दस्तावेज़ों में देखता हूं और आप केवल अद्यतन या शेयर के लिए तालिका को लॉक कर सकते हैं। आप 'डीबी :: टेबल (' आयात ') -> लॉक ($ लॉक अपडेट) का उपयोग करके ऐसा कर सकते हैं; ' – Siper

उत्तर

2
// prevent rows from being modified until you're finished 
DB::table('imports')->where('total', '>', 10)->sharedLock()->get(); 

उपयोग lockForUpdate() बजाय संशोधित या किसी अन्य साझा लॉक के साथ चयनित किए जाने से पंक्तियों को रोकने के लिए।

+5

हाय, लॉक कब जारी किया जाता है? – supersan

+0

एनबी: साझा लॉक * * पंक्ति * (तालिका नहीं) पर लिखना बंद कर देगा। अपने प्रश्न का उत्तर देने के लिए, सुपरसैन, एक बार लेनदेन पूरा हो जाने पर इसे रिलीज़ किया जाएगा। – jonlink

5

आप पूरी तालिका लॉक करने के लिए चाहते हैं और आप LOCK TABLES table_name WRITE उपयोग करने के लिए यह किया जाना चाहिए इस तरह से DB::unprepared('LOCK TABLES imports WRITE'); में फोन चाहते हैं, लेकिन अगर आप केवल चयनित पंक्तियों पर ताला लागू करना चाहते हैं तो का उपयोग कर sharedLock() या lockForUpdate() ऐसा करने के लिए सही तरीका है तो इसलिए यह केवल चयनित पंक्तियों को वापस लाएगा और लॉक करेगा।

+1

एनबी: यह तालिका * और * लिखने के लिए तालिका को लॉक कर देगा। यह तब तक बंद रहेगा जब तक 'डीबी :: तैयार नहीं किया जाता है (' अनलॉक टेबल ') का उपयोग किया जाता है। – jonlink

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