0

Tornado Web サーバーを使用してサーバー アプリケーションを作成しています。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

私の知る限り、 Pythonモジュールtornado.databaseの比較的単純なラッパーMySQLdbであり、接続ごとにのみ最後の行IDの正しい動作を保証します。私の場合、アプリケーション全体に対して 1 つの接続しかありません。

それで、複数の同時クライアントクエリの場合、/somequery最後の行IDがクライアント間で混乱したり、竜巻がそれを処理したりする可能性はありますか?

のソースを調べてtornado.databaseみましたが、質問に関して何も見つかりませんでした。

これがうまくいかない場合、どうすればよいですか?

4

1 に答える 1

2

execute_lastrowid(実際にtornado.databaseは一般的に)非同期ではありません。つまり、アプリケーションをブロックします。

したがって、別のクライアントのリクエストからIDを取得することはありませんが、1つの挿入に時間がかかる場合、他のクライアントはそれを待つ必要があります。

質問とは関係ありませんが、通常、データの変更(INSERTなど)にはGETリクエストを介してアクセスできないようにする必要があります。代わりにPOSTを使用してください。

于 2012-04-15T20:21:41.103 に答える