スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

テーブルキューの実現方法

以下のようなテーブルがあり、レコードが登録されると処理される仕組みを考えます。
CREATE TABLE t_queue (id int primary key, data text);

1レコード取得して、それレコードを削除します。
もし他のプロセスなどで処理済みの場合
削除した結果は1にならないので、自分では処理を行わないことが判断できます。
rubyのpgで書くと以下のようになります。
res_sel = conn.exec("SELECT * FROM t_queue ORDER BY id LIMIT 1")
res_del = conn.exec("DELETE FROM t_queue WHERE id = $1", [res_sel[0]["id"]])
if 1 != res_del.cmdtuples
// 他のプロセスが処理済み
conn.exec("ROLLBACK")
return
end
conn.exec("COMMIT")

// 取得したデータで処理
data = res_sel[0]["data"]
...

削除のタイミングが同時に起こることはありません。先に削除を実行したプロセスがロックをかけます。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。