Para se garantir que a consistência dos dados é necessário garantir-se que transações sejam executadas de maneira correta: atômica:
Mas isto não é uma boa idéia...
vende_peça(peça, quant, valor, cliente)
{
read(estoque, peça);
estoque->quant -= quant;
write(estoque, peça);
read(controle, ultima_transação);
ultima_transação++;
write(controle, ultima_transação);
write(transações, ultima_transação,
VENDA, peça, quant, valor, data);
write(contas_a_receber, data, valor,
cliente);
}
Grava-se neste arquivo toda e qualquer operação antes de se a executar.
vende_peça(peça, quant, valor, cliente)
{
write(log, ``T%d starts'', i);
read(estoque, peça);
estoque->quant -= quant;
write(log, estoque, peçaold, peça);
write(estoque, peça);
read(controle, ult_tr_#);
ultima_transação++;
write(log, controle,
ult_tr_#old, ul_tr_#);
write(controle, ultima_transação);
write(log, transações, ...);
write(transações, ultima_transação,
VENDA, peça, quant, valor, data);
write(log, contas_a_receber, ...);
write(contas_a_receber, data, valor,
cliente);
write(log, ``T%d commits'', i);
}
vende_peça(peça, quant, valor, cliente)
{
read(estoque, peça);
estoque->quant -= quant;
write(estoque, peça);
read(controle, ultima_transação);
ultima_transação++;
write(controle, ultima_transação);
write(transações, ultima_transação,
VENDA, peça, quant, valor, data);
write(contas_a_receber, data, valor,
cliente);
}
Cada acesso trava o registro no arquivo:
good_read(arquivo, id) {
lock(mutex);
while (r == ``locked'')
read(arquivo, id, r);
write(arquivo, id, ``locked'');
unlock(mutex);
return(r);
};
Este protocolo:
vende_peça(peça, quant, valor, cliente)
{
/* growing phase */
read(estoque, peça);
estoque->quant -= quant;
read(controle, ultima_transação);
read(transações);
read(contas_a_receber);
/* shrinking phase */
write(estoque, peça);
ultima_transação++;
write(controle, ultima_transação);
write(transações, ultima_transação,
VENDA, peça, quant, valor, data);
write(contas_a_receber, data, valor,
cliente);
}