2012-10-01 94 views
2

我們使用momoko並具有以下標準設置爲異步連接在龍捲風應用到DB:在非阻塞客戶端的交易?

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     # Create a database connection when a request handler is called 
     # and store the connection in the application object. 
     if not hasattr(self.application, 'db'): 
      self.application.db = momoko.AsyncClient({ 
       'host': 'localhost', 
       'database': 'momoko', 
       'user': 'frank', 
       'password': '', 
       'min_conn': 1, 
       'max_conn': 20, 
       'cleanup_timeout': 10 
      }) 
     return self.application.db 

有一天,我發現像這樣的代碼,將阻止應用程序:

fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;') 

第一個想法,這是進來,是:

try: 
    fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;') 
except: 
    reconnect() 

經過一些挖掘主題後,我發現最好做一些事情摹這樣的:

try: 
    fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;') 
except: 
    yield gen.Task(self.db.execute, 'ROLLBACK;') 

最後,探索桃子的source code後,我發現,這是更好地使用阻塞客戶端進行交易。

所以BaseHandler轉化爲:

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     # Create a database connection when a request handler is called 
     # and store the connection in the application object. 
     if not hasattr(self.application, 'db'): 
      self.application.db = momoko.AsyncClient({ 
       'host': 'localhost', 
       'database': 'momoko', 
       'user': 'frank', 
       'password': '', 
       'min_conn': 1, 
       'max_conn': 20, 
       'cleanup_timeout': 10 
      }) 
     return self.application.db 

    @property 
    def bdb(self): 
     # Create a database connection when a request handler is called 
     # and store the connection in the application object. 
     if not hasattr(self.application, 'bdb'): 
      self.application.bdb = momoko.BlockingClient({ 
       'host': 'localhost', 
       'database': 'momoko', 
       'user': 'frank', 
       'password': '', 
       'min_conn': 1, 
       'max_conn': 20, 
       'cleanup_timeout': 10 
      }) 
     return self.application.bdb 

現在我的問題...有沒有在AsyncClient使用任何交易安全的方式?或者AsyncClient通常用於從數據庫中讀取數據,而不是在那裏寫入/更新數據?

回答

1

我正在研究Momoko 1.0.0,我剛剛發佈了第一個測試版。交易是新功能之一。這是我在郵件列表後:1.0.0之前https://groups.google.com/forum/?fromgroups=#!topic/python-tornado/7TpxBQvbHZM

版本不支持事務,因爲每次你運行execute有一種可能性,即AsyncClient會爲您挑選一個新的連接,你將無法回滾您如果出現任何問題,交易。

我希望這會有所幫助。 :)

+0

感謝您的偉大的驅動程序。 :) –