आमतौर पर, ऐसे समवर्ती मुद्दों के समाधान में लेन-देन और आशावादी लॉकिंग . शामिल होते हैं :जब आप काउंटर को अपडेट करते हैं, तो where
जोड़ें पुराने मान की जाँच करने और अद्यतन की गई पंक्तियों की संख्या गिनने के लिए खंड।
v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x
यदि इस दौरान काउंटर को अपडेट किया गया था, तो अपडेट किसी भी पंक्ति को नहीं बदलेगा -- इसलिए आप जानते हैं कि आपको रोलबैक करना होगा और लेन-देन को एक बार फिर से आज़माना होगा।
एक समस्या यह है कि इससे उच्च विवाद हो सकता है , केवल कुछ लेन-देन के साथ जो सफल होता है और बहुत कुछ विफल होता है।
तब निराशावादी लॉकिंग . से चिपके रहना बेहतर हो सकता है , जहां आप पहले पंक्ति को लॉक करते हैं, फिर उसे अपडेट करते हैं। लेकिन केवल एक बेंचमार्क ही आपको बताएगा।
संपादित करें
यदि आप आशावादी लॉकिंग के बिना लेनदेन का उपयोग करते हैं तो निम्न परिदृश्य हो सकता है।
Max authorized = 50. Current value = 49.
T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock
दोनों लेन-देन सफल होते हैं, मान 50 है, लेकिन एक असंगति है।