2011-09-14 10 views
5

मैं के बाद एक लेनदेन में क्या करना चाहते हैं:नौसिखिया एसक्यूएल लेनदेन प्रश्न: पढ़ने में रोकने दौड़ - गणना लिखें

  • एक स्तंभ
  • यदि स्तंभ मान एक निश्चित शर्त से मेल खाता है पढ़ा है, एक को लिखने कॉलम

लेनदेन अलगाव को पढ़ने के लिए सेट किया गया है, सर्वर SQL सर्वर है।

मैं कैसे गारंटी दे सकता हूं कि एक और लेनदेन कॉलम पर इसे पढ़ने के बाद अलग-अलग मान नहीं लिखता है? क्या सर्वर ने मेरे लिखने को अस्वीकार कर दिया है यदि कोई अन्य लेनदेन कॉलम बदल गया है?

दूसरे शब्दों में, क्या SQL सर्वर किसी दिए गए कॉलम पर वितरित लॉक के रूप में उपयोग किया जा सकता है?

उत्तर

1

इस मामले में आपको REPEATABLE READ अलगाव स्तर का उपयोग करने की आवश्यकता है। READ COMMITTED के साथ एक और लेनदेन आपके रिकॉर्ड को बदल सकता है।
यदि आप 1 तर्क में अपने तर्क को फिर से लिख सकते हैं (उदाहरण के लिए, update या merge के साथ), तो आप अभी भी READ COMMITTED का उपयोग कर सकते हैं। लेकिन कभी-कभी यह विकल्प नहीं है। उदाहरण के लिए,

SELECT ... ; 
IF some_condition 
BEGIN 
    // execute a procedure, select from other tables, etc 
END 
ELSE 
BEGIN 
    // execute another procedure, do some other stuff 
END; 
// finally update the record 
UPDATE .... 

अद्यतन

वहाँ एक और विकल्प मैं उल्लेख करना भूल गया है: उपयोग तालिका संकेत REPEATABLEREAD अपने SELECT बयान में (विवरण के लिए See)

4

किसने कहा कि आपको इसे पहले पढ़ना है?

UPDATE yourtable 
SET yourcolumn = CASE 
         WHEN certaincondition = 1 THEN 'newvalue' 
         ELSE yourcolumn 
        END 
WHERE id = 'yourid' 

आप UPDATE के अंदर ही मूल्यांकन करते हैं। यह पूरी तरह से अलग होने की गारंटी है। आप अलग-अलग उदाहरणों से चल रहे UPDATE में से कई को प्राप्त कर सकते हैं, लेन-देन कतारबद्ध और एक-एक करके संसाधित किया जाएगा।

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