2010-12-20 10 views
5

चलो कहते हैं कि मुझे लगता है कि कारों की एक गुच्छा के लिए एक गैरेज के रूप में कार्य एक डेस्कटॉप अनुप्रयोग करते हैं:एकाधिक धागे डाटाबेस को ऐक्सेस: कम लेनदेन के साथ लंबे समय से लेन-देन, एक के साथ एक

@Entity 
public class Garage { 
    private List<Car> cars = new ArrayList<Car>(); 
    ... 
} 

डेस्कटॉप ऐप्लिकेशन एक "अनुकरण है "बटन जो एक नया धागा शुरू करता है और गैरेज, कार, व्हील इत्यादि पर कॉलिंग विधियों को शुरू करता है। इस सिमुलेशन में 10 मिनट तक चल सकते हैं। फिलहाल मैं एक वर्ग है कि इस तरह दिखता है:

beginTransaction(); 
Garage garage = garageDao.findGarage(1); 
List<Car> cars = garage.getCars(); 
for (Car car : cars) { 
    // call methods on the car to lazily fetch other things like wheels... 
} 
commitTransaction(); 

इस कोड को केवल करता है "लिखा है" और कभी नहीं "लिखते हैं,"

तो ऊपर कितनी बुरी तरह से कारों की जरूरत के आधार पर एक लंबा समय लग सकता एक सेवा। जबकि उपरोक्त हो रहा है, उपयोगकर्ता डेस्कटॉप ऐप का उपयोग कर काम करना जारी रख सकता है। वे उपरोक्त लेनदेन में इस्तेमाल होने वाली कार का रंग बदलना चुन सकते हैं।

मेरा सवाल यह है कि क्या उपर्युक्त लंबे लेनदेन कार के रंग को बदलने से रोकने जा रहा है? यानी डेस्कटॉप ऐप में कार के रंग को बदलने वाले उपयोगकर्ता को लंबे लेनदेन समाप्त होने तक परिवर्तन करने से रोका जाएगा?

+0

आपको पढ़ने के लिए लेनदेन की आवश्यकता क्यों है? क्या आप आलसी लाने का उपयोग कर रहे हैं? – saugata

+0

'अपडेट थ्रेड' एक एकल लेनदेन इकाई होना चाहिए? या कोई अपडेट नहीं हैं? आप कहते हैं "यह कोड केवल 'पढ़ता है' और कभी नहीं लिखता है। फिर - जैसे सुगाता ने पूछा - आपको लेनदेन की आवश्यकता क्यों है? –

+0

हां कारों पर बुलाए जाने वाले तरीके कुछ हो सकते हैं जैसे वेल्स() और वे आलसी हो रहे हैं – digiarnie

उत्तर

4

ऐसा क्यों होना चाहिए? आप डिफ़ॉल्ट रूप से आशावादी लेन-देन का उपयोग कर रहे हैं, इसलिए पंक्तियों को पढ़ने के लिए लागू करने के लिए कोई लॉकिंग नहीं है (जब तक कि आप हमें कुछ जेपीए 2 लॉक() कॉल नहीं दिखा रहे हों)। लेनदेन की प्रतिबद्धता तब रिकॉर्ड्स के आशावादी संस्करण (यदि आपके पास संस्करण परिभाषित किया गया है) पर जांच करनी चाहिए और यह तय करने के लिए इसका उपयोग करना है कि परिवर्तन करना है या नहीं।

+0

नोप लाया, कोई ताला() कॉल नहीं – digiarnie

0

उत्तर सबसे अधिक संभावना है कि आप किस डेटाबेस का उपयोग करते हैं, और अधिक महत्वपूर्ण लेनदेन अलगाव स्तर पर निर्भर करता है।

लेकिन उत्तर सामान्य रूप से नहीं है: उन्हें ब्लॉक नहीं करना चाहिए (लेकिन जैसा कि मैंने कहा, डेटाबेस और लेनदेन स्तर पर निर्भर करता है)।

0

जैसा कि ऊपर:

आम तौर पर, केवल पढ़ने के संचालन के लिए एक डेटाबेस में लिखने के संचालन ब्लॉक नहीं करना चाहिए। तो आपका लंबा, पढ़ना धागा छोटे लेखन कार्यों को अवरुद्ध नहीं करना चाहिए।

मुझे लगता है कि आपके डेटाबेस के लिए अलगाव स्तर को कॉन्फ़िगर करना संभव है और लिखने वाले कनेक्शन को लंबे समय तक पढ़ने वाले बयान द्वारा अवरुद्ध किया जा सकता है लेकिन यह मुझे पता है कि किसी भी डेटाबेस प्रकार पर डिफ़ॉल्ट नहीं है।

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