Возможность сериализации
В идеале транзакции должны быть сериализуемыми. Транзакции, как говорят, сериализуются, если результаты выполнения транзакций одновременно совпадают с результатами их последовательного выполнения , то есть один после другого. Не важно, какая транзакция выполняется в первую очередь, только то, что результат не отражает ни одного сочетания транзакций.
Например, предположим, что транзакция A умножает значения данных на 2, а транзакция B добавляет 1 к значениям данных. Теперь предположим, что есть два значения данных: 0 и 10. Если эти транзакции выполняются один после другого, новые значения будут иметь значение 1 и 21, если транзакция А выполняется первой, или 22 и 22, если транзакция B выполняется первым. Но что делать, если порядок выполнения двух транзакций отличается для каждого значения? Если транзакция A выполняется сначала на первом значении, а транзакция B выполняется сначала во втором значении, новые значения — 1 и 22. Если этот порядок отменен, новые значения — 2 и 21. Транзакции сериализуются, если 1, 21 и 22 являются единственными возможными результатами. Транзакции не сериализуются, если 1, 22 или 21 является возможным результатом.
Поэтому почему сериализуемость желательна? Иными словами, почему важно, чтобы одна транзакция завершилась до начала следующей транзакции? Рассмотрим следующую проблему. Продавец вводит заказы в то же время клерк отправляет счета. Предположим, что продавец вводит заказ от компании X, но не фиксирует его; Продавец по-прежнему разговаривает с представителем компании X. Клирк запрашивает список всех открытых заказов и обнаруживает заказ компании X и отправляет им счет. Теперь представитель компании X решает, что он хочет изменить свой заказ, поэтому продавец изменяет его перед фиксацией транзакции. Компания X получает неправильный счет.
Если транзакции продавца и клерка были сериализуемыми, эта проблема никогда не произошла. Либо транзакция продавца была бы завершена до начала транзакции клерка, в этом случае клерк отправил бы правильный счет, или транзакция клерка была бы завершена до начала транзакции продавца, в этом случае клерк не отправил бы счет компании X вообще.