0

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

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它是一个相对简单的MySQLdbpython 模块包装器,它只保证每个连接的最后一行 id 的正确工作。就我而言,整个应用程序只有一个连接。

那么,如果有几个并发的客户端查询/somequery,最后一行 ID 是否可能会在客户端之间出现混乱,或者龙卷风会处理它?

我尝试查看的来源tornado.database但没有发现任何关于我的问题的信息。

如果这不能正常工作,该怎么办?

4

1 回答 1

2

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

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

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

于 2012-04-15T20:21:41.103 回答