Landscape トップページ | < 前の日 2003-05-28 2003-05-29 次の日 2003-05-30 >


* ガソリン

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [給油]

(44.10 * 96) * 1.05 = 4446

* データベースで読み込みをブロックするためのロック

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [SQL]

使用済みフラグが false の行を SELECT し、データを取得。
その後、使用済みフラグを立てるという処理を考える。
環境は PostgreSQL 7.2.1 を想定。

この問題は、SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
で単純にトランザクションレベルを上げても対処できない。

1: BEGIN;
2: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3: SELECT id, data FROM table WHERE flag = FALSE;
4: ------ アプリケーションの処理 ------
5: UPDATE table SET flag = FALSE;
6: COMMIT;

これだと、3 の SELECT が終わった後に別のトランザクションが開始した場合、
更新予定の行も SELECT で読み込まれてしまう。
結果、同じ行を SELECT してしまい、その後 5 のUPDATE を発行しようとした時点で
SERIALIZABLE の分離チェックに引っかかり、2つ目のトランザクションはアボートしてしまう。
ERROR: Can't serialize access due to concurrent update

エラーを発生させずに処理を行うためには、更新トランザクションだけではなく
参照トランザクションもブロックしなければならない。
つまり、この問題はトランザクションレベルの設定では解決できない。

- 解決するには、LOCK 文で行またはテーブルをロックする必要がある。

LOCK TABLE table IN ACCESS EXCLUSIVE MODE;
ACCESS EXCUSIVE MODE でロックすることで、SELECT 文自体もブロックされる。

1: BEGIN;
2: LOCK TABLE table IN ACCESS EXCLUSIVE MODE;
3: SELECT id, data FROM table WHERE flag = FALSE;
4: ------ アプリケーションの処理 ------
5: UPDATE table SET flag = FALSE;
6: COMMIT;

- サンプル

BEGIN TRANSACTION;
LOCK TABLE uniq_uri IN ACCESS EXCUSIVE MODE;
SELECT TOP 1 uri FROM uniq_uri WHERE digit = 5 AND last_update IS NULL;
COMMIT TRANSACTION;

- 参考:

PostgreSQL 7.3.2 ユーザガイド Chapter 9. 同時実行制御
http://www.postgresql.jp/document/pg732doc/user/mvcc.html

[pgsql-jp: 29112] 同時更新の制御2
http://ml.postgresql.jp/pipermail/pgsql-jp/2003-February/004 ...

* Perlのページ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

Unicode 関連モジュールやドキュメントがある。
http://homepage1.nifty.com/nomenclator/perl/
すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。