2012-10-17 17 views
6

ये हम चले:mysql लॉक त्रुटि या बग?

mysql> LOCK TABLES radcheck WRITE; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (
    ->  SELECT id FROM (
    ->   SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1 
    ->  ) AS c 
    ->); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 

WTF?

संपादित

SET AUTOCOMMIT = 0 
    -> ; 
Query OK, 0 rows affected (0.00 sec) 

mysql> LOCK TABLES radcheck WRITE; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 



mysql> LOCK TABLES radcheck READ; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 

पीडी: क्वेरी ठीक काम करता है अगर मैं तालिका को लॉक नहीं। पीडी: यह केवल एक examply टीआई सवाल को सरल बनाता है .. असली जीवन में एक DELETE है ...

+1

मेरा उत्तर जाँच http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

भीतरी मेज पर

परीक्षण किया नमूना एक उपनाम दे। आपको सभी तालिकाओं को उपनाम देना होगा। और उपनाम तालिका को उस उपनाम के साथ भी लॉक करने की आवश्यकता है –

उत्तर

12

जब आप लॉक तालिकाओं का उपयोग, आप अपने प्रश्न में सभी तालिकाओं लॉक करने के लिए की जरूरत है। जब आप सबक्वायरी का उपयोग करते हैं तो यह एक टेबल बनाता है। और आप इसे लॉक नहीं कर रहे हैं। क्योंकि आपको त्रुटि मिल रही है।

संदर्भ:

lock tables products as p1 write, products as p2 write ; 
select product_id from products as p1 
where product_id not in ( 
select product_id from products p2 where product_id in (1,2) 
) 

और शायद आप इस की जरूरत है::

lock tables radcheck as r1 write, radcheck as r2 write ; 

SELECT * FROM radcheck r1 WHERE id NOT IN (
SELECT id FROM (
    SELECT id FROM radcheck r2 WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1) AS c 
); 
0

आप WRITE के लिए टेबल पर ताला लगा रहे हैं। READ के लिए आपको टेबल लॉक करने की आवश्यकता है क्योंकि आप SELECT का उपयोग कर रहे हैं जो केवल टेबल से पढ़ता है।

हालांकि आपको वास्तव में तालिकाओं को लॉक नहीं करना चाहिए क्योंकि यह समवर्तीता को रोकता है।

संपादित

तुम भी रूप में आप क्वेरी में दो बार एक ही तालिका का उपयोग कर रहे उपनाम का उपयोग करने की जरूरत है।

अर्थात

LOCK TABLES radcheck AS read1 READ, radcheck AS read2 READ; 
SELECT * 
FROM radcheck AS read1 
WHERE id NOT IN 
    (
     SELECT id FROM radcheck AS read2 
     WHERE attribute = 'Password' 
     GROUP BY UserName 
     HAVING COUNT(*) > 1 
    ); 
संबंधित मुद्दे