2012-06-03 15 views
5

मेरे पास एक Grails सेवा है जो लेनदेन के रूप में चिह्नित है और यह बहुत सी चीजें करता है।Grails लेनदेन के मुद्दे

मैं इस विधि में कोड जोड़ने कर रहा हूँ और परिणाम है कि मैं उम्मीद जब मैं इसके माध्यम से कदम नहीं मिल रहा:

  1. मैं कोड है कि .save() MySQL बैकएंड में नहीं देखा जा सकता है कि जब तक पूरे विधि खत्म कॉल की है। यही वह है जो मुझे उम्मीद है कि सेवा विधि लेनदेन है।
  2. मेरे पास अन्य कोड है जो .save() पर कॉल करता है जो सेवा विधि समाप्त होने से पहले MySQL में देखा जा सकता है। मुझे यह समझ में नहीं आता है और मुझे इसके बीच असमानता नहीं है और 1.
  3. मेरे पास अभी तक और अधिक कोड है जो डेटाबेस में डालने के लिए groovy.sql.Sql का उपयोग करता है। मुझे लगता है कि यह Grails लेनदेन प्रसंस्करण के बाहर है, इसलिए तथ्य यह है कि यह विधि समाप्त होने से पहले करता है समझ में आता है। क्या मैं लेनदेन के अंदर इसे प्रबंधित करने के लिए Grails प्राप्त कर सकता हूँ?

कृपया मेरी धारणाओं में किसी भी त्रुटि के बारे में मुझे अवगत कराएं। विधि

public void updateDb(Date date) { 
     // Create the results 
     if (createResults() > 0) { 
      createA() 
      createB() 
     } 
} 

createA

A a = new a() 
a.user = user 
a.week = week 
a.save() 

createB

userWeek = new UserWeek(user: user) 
userWeek.number = 1 
userWeek.save(flush: true) 

मुख्य सेवा: यहाँ कुछ प्रासंगिक कोड हैcreateResults

String insert = "insert into ..." 
Sql sql = new Sql(dataSource) 
sql.execute(insert) 

मैं इसे फ्लश बनाने के लिए flush:true जोड़ा है, लेकिन अब मैं समझता हूँ कि सिर्फ फ्लश हाइबरनेट करने के लिए नहीं बल्कि वास्तव में इस लेनदेन के लिए प्रतिबद्ध है, क्योंकि यह व्यवहार है। मैं क्या गलत कर रहा हूं? लेन-देन है कि आपकी सेवा विधि के बजाय Sql constructor that takes a connection argument का उपयोग करके उपयोग कर रहा है में

groovy.sql.Sql
+0

यह स्पष्ट नहीं है कि आपके द्वारा पोस्ट किए गए कोड से क्या हो रहा है, और यह भी मुझे लगता है कि आप सम्मेलन तोड़ रहे हैं। एक लेनदेन संबंधी संदर्भ (Grails विधि कॉल) के भीतर से आप जानबूझकर लेनदेन से बाहर तोड़ने की कोशिश कर रहे हैं? इसके अलावा, आप फ्लश क्यों मजबूर कर रहे हैं? –

+0

@ हंसवेस्टरबेक मैं किसी भी लेन-देन से बाहर निकलने की कोशिश नहीं कर रहा था - मैं बस उस कोड को देख रहा हूं जिसे मैंने विरासत में मिला और इसे समझने की कोशिश की। मैंने एक परीक्षण के रूप में फ्लश को मजबूर कर दिया (क्योंकि उस समय मुझे समझ में नहीं आया) लेकिन मैं इसे हटाने की योजना बना रहा हूं।कुछ भी नहीं (मौजूदा 'createResults' विधि से जो लेनदेन के बाहर काम करता है) को पूरा लेनदेन करने तक प्रतिबद्ध होना चाहिए, है ना? – skaz

उत्तर

7

आप प्राप्त कर सकते हैं चल रहा है:

  Sql sql = new Sql(sessionFactory.currentSession.connection()) 

इस डेटा की समस्या को हल करना चाहिए एक ही सेवा विधि में अलग अलग समय पर प्रतिबद्ध हो रही है।

+0

धन्यवाद - यह निश्चित रूप से मेरी समस्या का हिस्सा हल करेगा! – skaz

0

मैं इसी तरह की स्थिति में था। मेरे लिए यह हल किया गया था ताज़ा() - विधि को बुला रहा था। मैंने फ्लश की भी कोशिश की: सच और अन्य चीजों का भार लेकिन कुछ भी काम नहीं किया।

आप here रीफ्रेश करने के बारे में पढ़ सकते हैं।