उत्पन्न करने वाली संग्रहीत प्रक्रिया के साथ MySQL deadlocks मेरे पास एक "टिकट" तालिका से यूआईडी उत्पन्न करने वाली एक संग्रहीत प्रक्रिया है, लेकिन लोड के तहत मुझे बहुत सारे डेडलॉक्स मिल रहे हैं। जब भी मेरे कार्य को एक नया यूआईडी चाहिए तो मैं कई बार समवर्ती कनेक्शन से इस प्रक्रिया को बुला रहा हूं।यूआईडी
BEGIN
DECLARE a_uid BIGINT(20) UNSIGNED;
START TRANSACTION;
SELECT uid INTO a_uid FROM uid_data FOR UPDATE; # Lock
INSERT INTO uid_data (stub) VALUES ('a') ON DUPLICATE KEY UPDATE uid=uid+1;
SELECT a_uid+1 AS `uid`;
COMMIT;
END
मैं उपयोग करने पर विचार किया:
BEGIN
REPLACE INTO uid_data (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
END
हालांकि मैं अगर है कि समवर्ती कनेक्शन के साथ सुरक्षित रूप में वहाँ कोई ताला है, SELECT FOR UPDATE
के साथ पहली प्रक्रिया के विपरीत होगा यकीन नहीं था।
mysql> DESCRIBE uid_data;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| uid | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| stub | char(1) | NO | UNI | NULL | |
+-------+---------------------+------+-----+---------+----------------+
मैं पढ़ने के लिए प्रतिबद्ध लेनदेन अलगाव के लिए सेट किया हुआ:
यहाँ तालिका है
mysql> SHOW VARIABLES LIKE 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | READ-COMMITTED |
+---------------+-----------------+
यहाँ है कि मैं क्या से SHOW ENGINE INNODB STATUS;
...
... dozens and dozens of the following record locks...
Record lock, heap no 1046 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 1; hex 61; asc a;;
1: len 8; hex 00000000000335f2; asc 5 ;;
Record lock, heap no 1047 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 1; hex 61; asc a;;
1: len 8; hex 00000000000335f1; asc 5 ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 13 page no 4 n bits 1120 index `stub` of table `my_db`.`uid_data` trx id 13AA89 lock_mode X waiting
Record lock, heap no 583 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 1; hex 61; asc a;;
1: len 8; hex 00000000000334a8; asc 4 ;;
*** WE ROLL BACK TRANSACTION (1)
मैं वापस हो रही है अगर कोई समझा सकता है कि क्या हो रहा है और उन्हें कैसे टाला जा सकता है, तो आभारी रहें।
जानकारी के लिए: इस सरल अनुक्रम का उपयोग करते समय भी डेडलॉक होता है: 'ट्रांज़ेक्शन प्रारंभ करें; अद्यतन के लिए uid_data से यूआईडी चुनें; अद्यतन uid_data SET uid = uid +1 [[यहां संभव डेडलॉक]]; COMMIT; '(इसलिए इसका 'ऑन डिप्लिकेट' क्लॉज से कोई लेना देना नहीं है)। हालांकि, 'दोहराए गए पढ़ने' के अलगाव स्तर के साथ कोई डेडलॉक नहीं होता है। मुझे अभी भी पता नहीं है कि इस बिंदु से क्या निष्कर्ष निकालना है। – RandomSeed