Eu tenho uma matriz que posso atualizar de vários trabalhadores da seguinte forma:
UPDATE my_table SET arr = array_append(my_table.arr, element)
.
O problema aparece quando dois trabalhadores tentam atualizar a matriz ao mesmo tempo. Por exemplo, ambos os trabalhadores veem que no momento da atualização, o array está vazio e tentam anexar um elemento da seguinte forma:
array_append(empty_arr, element_a)
e array_append(empty_arr, element_b)
. No final, o conteúdo final do array será: arr[element_a]
ou arr[element_b]
porque um dos workers terminará de atualizar o array mais cedo e seu valor será substituído pelo valor do outro worker. Como posso garantir que ambos os valores sejam escritos na matriz: arr[element_a, element_b]
?
Não há nada que você precise fazer, pois esse tipo de anomalia não pode ocorrer no PostgreSQL.
Quando a segunda transação obtiver o bloqueio na linha, ela a lerá novamente e verá o valor modificado pela primeira transação.
Consulte a documentação para obter detalhes.