Ir para o conteúdo principal

Obter e atualizar atomicamente uma linha (LCC.db.fetch_one)

Declaração​

row, err = LCC.db.fetch_one(name, opts, timeout?)

Parâmetros​

  • name
    Tipo string; nome da tabela, não vazio e com no máximo 256 bytes
  • opts
    Tipo table; contém os seguintes campos:
    • conditions: tipo table; condições de filtragem por igualdade, padrão {}
    • update: tipo table; conjunto de campos a atualizar depois que a obtenção tem sucesso
    • pick: tipo string, opcional, "min" / "max" / "random", padrão "min"; escolhe o registro com base em id
  • timeout
    Tipo number, opcional; tempo limite da solicitação (em segundos), padrão 60

Valor de retorno​

  • row
    Tipo table; objeto da linha obtida, ou nil em caso de falha ou quando nenhuma linha corresponde
  • err
    Tipo string ou nil; descrição do erro em caso de falha. Quando nenhuma linha corresponde, retorna 'not found'; quando a tabela não existe, retorna 'unknown table'

Descrição​

Lê e atualiza atomicamente um registro, sendo adequado para cenários concorrentes como atribuição de tarefas.
O campo update é gravado imediatamente depois da leitura para garantir que a mesma linha não seja atribuída novamente.
Sem update, ainda seleciona uma linha atomicamente, mas não grava nenhum campo de volta.

Exemplo​

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