Partilhar via


Seriabilidade

O ideal é que as transações sejam serializáveis. As transações são serializáveis quando os resultados da execução simultânea de transações são iguais aos resultados da execução em série, ou seja, um após o outro. Não é importante qual transação é executada primeiro, apenas que o resultado não reflete nenhuma mistura de transações.

Por exemplo, suponha que a transação A multiplique os valores de dados por 2, enquanto a transação B adicione 1 aos valores de dados. Suponha agora que haja dois valores de dados: 0 e 10. Se essas transações forem executadas uma depois da outra, os novos valores serão 1 e 21 se a transação A for executada primeiro, ou 2 e 22 se a transação B for executada primeiro. Porém, e se a ordem em que as duas transações são executadas for diferente para cada valor? Se a transação A for executada primeiro no primeiro valor e a transação B for executada primeiro no segundo valor, os novos valores serão 1 e 22. Ao inverter essa ordem, os novos valores serão 2 e 21. As transações serão serializáveis se 1, 21 e 2, 22 forem os únicos resultados possíveis. As transações não serão serializáveis se 1, 22 ou 2, 21 for um resultado possível.

Então, por que é desejável que haja capacidade de serialização? Em outras palavras, por que é importante que pareça que uma transação termina antes de a seguinte começar? Considere o problema a seguir. Um vendedor está inserindo ordens ao mesmo tempo em que um atendente está enviando cobranças. Suponha que o vendedor insira uma ordem da Empresa X, mas não a confirme; o vendedor ainda está conversando com o representante da empresa X. O atendente solicita uma lista de todas as ordens em aberto, descobre a ordem para a Empresa X e envia uma cobrança. Agora, o representante da Empresa X decide que quer alterar a ordem, então o vendedor a altera antes de confirmar a transação. A Empresa X recebe uma cobrança incorreta.

Se as transações do vendedor e do atendente fossem serializáveis, esse problema nunca teria acontecido. Ou a transação do vendedor teria terminado antes do início da transação do atendente, caso em que o atendente teria enviado a cobrança correta, ou a transação do atendente teria terminado antes do início da transação do vendedor, caso em que o atendente não teria enviado uma cobrança para a Empresa X.