在tornado数据库模块中execute_lastrowid(...)与并发工作正常吗?

时间:2012-04-15 14:58:28

标签: python mysql concurrency tornado

我正在使用Tornado web server编写服务器应用程序。应用程序通过tornado.database模块与MySQL数据库一起使用。在DB中有一个表

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.databaseMySQLdb python模块的一个相对简单的包装器,它保证了每个连接的最后一行id的正确工作。在我的情况下,整个应用程序只有一个连接。

因此,如果对/somequery进行多次并发客户端查询,最终行ID可能会在客户端之间混乱,还是龙卷风会处理它?<​​/ p>

我尝试调查tornado.database的{​​{3}},但对我的问题一无所知。

如果这不行,怎么办?

1 个答案:

答案 0 :(得分:2)

execute_lastrowid(实际上tornado.database一般而言)不是异步的,也就是说,它会阻止你的应用程序。

因此,您不会从其他客户端的请求中获取id,但如果一次插入需要很长时间,则其他客户端将不得不等待它。

与您的问题无关,但通常无法通过GET请求访问数据更改(例如INSERT)。改为使用POST。