2012-04-15 35 views
0

我正在使用Tornado web server來編寫服務器應用程序。應用程序通過tornado.database模塊與MySQL數據庫配合使用。在DB有一個表在龍捲風數據庫模塊中execute_lastrowid(...)與併發性一起工作嗎?

CREATE TABLE SampleTable (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    txt VARCHAR(256) 
); 

由於對某些查詢我需要寫一個新的記錄到此表,並返回新創建的記錄的id客戶的反應。所以在服務器代碼中,我有以下行:

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [(r'/somequery', queryHandler)] 
     tornado.web.Application.__init__(self, handlers) 
     self.db = tornado.database.Connection(
      host="localhost", database="sampledb", 
      user="sampleuser", password="samplepassword") 

和處理程序:

class queryHandler(tornado.web.RequestHandler): 
    def post(self): 
     lastid = self.db.execute_lastrowid("INSERT INTO \ 
              SampleTable (txt) \ 
              VALUES('some text');") 
     print lastid 

據我所知,tornado.database是一個比較簡單的包裝圍繞MySQLdb Python模塊,這保證了正確的工作只有每個連接的最後一行ID。在我的情況下,整個應用只有一個連接。

因此,如果有多個併發客戶端查詢到/somequery是否有可能最後一行ID會在客戶端之間搞亂或龍捲風處理它?

我試圖調查sourcetornado.database,但沒有發現任何關於我的問題。

如果這不行,可以怎麼辦?

回答

2

execute_lastrowid(實際上一般爲tornado.database)不是異步的,也就是說,它會阻止你的應用程序。

所以,你不會從另一個客戶端的請求中獲得id,但是如果一個插入需要很長時間,其他客戶端將不得不等待它。

與您的問題無關,但通常不應通過GET請求訪問數據更改(例如,INSERT)。改用POST。

+0

更改爲'post'。這不是實際的代碼,僅用於說明目的。我可以在哪裏找到有關異步和同步操作在龍捲風中如何混合的信息? – bazzilic 2012-04-16 00:14:24

+1

好問題。看起來tornado.database文檔裏沒有關於它的東西,真的。它在郵件列表上有所討論:http://groups.google.com/group/python-tornado/browse_thread/thread/9a08f5f08cdab108除此之外,概述(http://www.tornadoweb.org/documentation/ overview.html)和源代碼。 – 2012-04-16 09:24:01