1 行をアトミックに取得して更新する (LCC.db.fetch_one)
宣言
row, err = LCC.db.fetch_one(name, opts, timeout?)
引数
- name
文字列。テーブル名です。空文字列は使用できず、256 バイト以下である必要があります - opts
テーブル。次のフィールドを含みます。conditions:テーブル。等価フィルター条件です。既定値は{}ですupdate:テーブル。取得成功後に更新するフィールドの集合ですpick:任意の文字列。"min"/"max"/"random"から選択し、既定値は"min"です。idに基づいてレコードを選択します
- timeout
任意の数値。リクエストのタイムアウト(秒)です。既定値は60です
戻り値
- row
テーブル。引き当てた行オブジェクトです。失敗時または一致する行がない場合はnilになります - err
文字列またはnil。失敗時のエラー説明です。一致する行がない場合は'not found'、テーブルが存在しない場合は'unknown table'を返します
説明
レコードを 1 件アトミックに読み取って更新します。タスクの引き当てなどの並行処理に適しています。
updateフィールドは読み取り後すぐに書き戻されるため、同じ行が重複して割り当てられることを防げます。
updateを渡さない場合も 1 行をアトミックに選択しますが、フィールドは書き戻しません。
例
local row, err = LCC.db.fetch_one("タスクテーブル", {
conditions = { 状態 = "待機中" },
update = { 状態 = "処理中" },
pick = "min"
})
if row then
print("タスクを取得", row.id, row.名前)
elseif err == "not found" then
print("待機中のタスクはありません")
end