Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

स्पष्ट रूप से आदेश देकर डेड लॉक से बचें

यद्यपि आप इसे सीधे_जॉइन के माध्यम से कर सकते हैं, आप उन पंक्तियों पर ताले भी स्पष्ट रूप से प्राप्त कर सकते हैं जिन्हें आप पहले प्राप्त करना चाहते हैं, उस पर अपडेट के लिए चयन ... को डुप्लिकेट करके आप चाहते हैं।

CREATE TEMPORARY TABLE colorsToUpdate (
     colorID BIGINT(20) NOT NULL, 
     modelID BIGINT(20) NOT NULL
);

insert into colorsToUpdate ( colorID, modelID)
SELECT  id, model_id
FROM    colors
where id in (101, 105, 106);

#This will try to acquire lock on models
select m.* from models m
join colorsToUpdate c
on c.modelID = m.id
for UPDATE;

#this will try to get locks on models, and colors.
select m.*, c.*
from colorsToUpdate u
left join models m
on u.modelID = m.id
join colors c 
on u.colorID = c.ID
order by m.id asc, c.id asc
for update;

# do your data modification here.

drop table colorsToUpdate;

चूंकि लॉकिंग कई चरणों में की जाती है, इसलिए जब आप अस्थायी तालिका सेट करते हैं और जब आप दो तालिकाओं पर ताले प्राप्त करना समाप्त कर लेते हैं, तो तालिका 'रंग' में प्रविष्टियों को संशोधित करना संभव होगा।

यह आपके लिए ठीक हो सकता है (यानी यदि आप केवल मौजूदा प्रविष्टियों को संशोधित करना चाहते हैं, जब लेन-देन शुरू होता है) लेकिन सूक्ष्म बग का कारण बन सकता है यदि यह वह नहीं है जो आप चाहते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. शर्त के साथ दो तालिकाओं में शामिल हों - रूबी ऑन रेल्स

  2. तिथि के अनुसार सरणियों को छाँटना

  3. मेल खाने वाले टैग वाले सभी प्रोजेक्ट चुनें

  4. MySQL:OR क्लॉज को कैसे इंडेक्स करें

  5. क्या MySql sp_getapplock का समर्थन करता है