2010年09月26日

1レコードへの連続アクセスのテスト

WEBサービスなどでは1レコードに複数プロセスがSELECTとUPDATEを連続して行うことがあります。 そのような連続アクセスの場合、トランザクション分離レベルやクエリーによって動作がどのようになるかを確認してみました。

対象のデータベースはPostgreSQLとMySQLです。

テストはforkでプロセスを5個作成して、それぞれのプロセスが200まで連続して加算しています。 最後のプロセスのcountが1000になれば正常にカウントされたことになります。 1000に満たない場合はカウント漏れが発生していています。 エラーが発生した場合はエラーに、デッドロックが発生した場合はデッドロックという結果にしています。


クエリー
UPDATE test_postgres SET count=count+1 WHERE id=1;

結果
PostgreSQL:OK  MySQL:OK


クエリー
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT count AS current FROM test_postgres WHERE id=1 FOR UPDATE;
UPDATE test_postgres SET count=1+current WHERE id=1;
COMMIT;

結果
PostgreSQL:OK   MySQL:デッドロック


クエリー
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT count AS current FROM test_postgres WHERE id=1 FOR UPDATE;
UPDATE test_postgres SET count=1+current WHERE id=1;
COMMIT;

結果
PostgreSQL:エラー   MySQL:OK

詳細は以下にまとめています。
1レコードへの連続アクセスのテスト
posted by jun1 at 22:24| Comment(0) | TrackBack(0) | データベース
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40948611

この記事へのトラックバック