メインコンテンツへ移動

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