2012-07-18 41 views
6

Tôi đang cố gắng tìm hiểu cách thức giao dịch hoạt động trong mô-đun adbapi của xoắn. Tôi hiện đang sử dụng runOperation() để thực hiện các câu lệnh INSERT và UPDATE. Các tài liệu, mà tôi sẽ liên kết đến dưới đây, làm cho nó xuất hiện rằng nó hỗ trợ các giao dịch, nhưng nó không có vẻ theo cách mà tôi muốn. Dưới đây là một số mã ví dụ (nó chạy bên trong một máy chủ web lốc xoáy, nhưng hy vọng đó không phải là có liên quan):Hỗ trợ giao dịch trong adbapi xoắn

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") 

Trong trường hợp này mặc dù một ngoại lệ xảy ra trong khi gọi lại cuối cùng, cả hai câu lệnh INSERT và UPDATE được thực thi . Không phải những gì tôi muốn.

Tôi đã thử chuyển đổi sang sử dụng phương thức runInteraction(), nhưng tôi không chắc mình đang làm đúng cách.

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") 

Trong trường hợp này tôi nhận được hiệu ứng tôi muốn trong đó mọi thứ được cuộn lại nhưng bạn có thể thấy mã hoàn toàn khác. Thay vì chuỗi các cuộc gọi lại với nhau, trong đó mỗi cuộc gọi lại chạy một truy vấn, tôi chỉ thực hiện mọi thứ trong một phương thức lớn.

Cách này có phải được thực hiện để hỗ trợ các giao dịch không?

Dưới đây là các liên kết đến các tài liệu:

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

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

Trả lời

4

Yes. Ghi đè dựa trên runInteraction của bạn là chính xác.

+0

Cảm ơn bạn đã nhập! – d512

Các vấn đề liên quan