2012-07-18 14 views
6

में लेनदेन समर्थन मैं यह पता लगाने की कोशिश कर रहा हूं कि लेन-देन के एडबैपी मॉड्यूल में लेन-देन कैसे काम करते हैं। मैं वर्तमान में INSERT और UPDATE स्टेटमेंट निष्पादित करने के लिए runOperation() का उपयोग कर रहा हूं। दस्तावेज, जो मैं नीचे से लिंक करूंगा, ऐसा लगता है कि यह लेनदेन का समर्थन करता है, लेकिन ऐसा लगता है कि मैं जिस तरह से चाहता हूं। यहाँ कुछ उदाहरण कोड है (इसकी एक चक्रवात वेब सर्वर के अंदर चल रहा है, लेकिन उम्मीद है कि प्रासंगिक नहीं है):ट्विस्टेड adbapi

class OperationHandler(cyclone.web.RequestHandler): 
    @cyclone.web.asynchronous 
    def get(self, *args, **kwargs): 
     d = conn.runOperation("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')") 
     d.addCallback(self.next1) 

    def next1(self, rows): 
     d = conn.runOperation("UPDATE Table1 SET Field1 = 'c'") 
     d.addCallback(self.next2) 

    def next2(self, rows): 
     raise Exception("rollback") 
     self.finish("done") 

इस मामले भले ही एक अपवाद है, पिछले कॉलबैक में उठाया है दोनों सम्मिलित करें और अद्यतन बयान में क्रियान्वित कर रहे हैं । मैं क्या चाहता हूँ नहीं।

मैंने runInteraction() विधि का उपयोग करने के लिए परिवर्तित करने की कोशिश की, लेकिन मुझे यकीन नहीं है कि मैं इसे सही तरीके से कर रहा हूं।

class InteractionHandler(cyclone.web.RequestHandler): 
    @cyclone.web.asynchronous 
    def get(self, *args, **kwargs): 
     d = conn.runInteraction(self.someTransaction) 
     d.addCallback(self.done) 

    def someTransaction(self, txn): 
     txn.execute("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')") 
     txn.execute("UPDATE Table1 SET Field1 = 'c'") 
     txn.execute("UPDATE Table1 SET Field1 = 'd'") 

     raise Exception("rollback") 

    def done(self, rows): 
     print rows 
     self.finish("done") 

इस मामले में मैं प्रभाव मैं चाहता हूँ, जिसमें सब कुछ वापस लुढ़का हुआ है मिलता है, लेकिन आप कोड देख सकते हैं के रूप में काफी अलग है। कॉलबैक को एकसाथ चेन करने के बजाय, जहां प्रत्येक कॉलबैक एक क्वेरी चलाता है, मैं बस एक बड़ी विधि में सबकुछ निष्पादित कर रहा हूं।

लेनदेन का समर्थन करने के लिए इसे किस तरह से किया जाना है?

http://twistedmatrix.com/documents/current/core/howto/rdbms.html

http://twistedmatrix.com/documents/12.0.0/api/twisted.enterprise.adbapi.ConnectionPool.html#runInteraction

उत्तर

4

हाँ:

यहाँ प्रलेखन के लिंक हैं। आपका runInteraction-आधारित रीराइट सही है।

+0

इनपुट के लिए धन्यवाद! – d512

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