Добавить комментарий

Неточность

Стандарт ISO (ANSI) SQL-92 не содержит уровня изолированности snapshot. Стандартом 92-го года предусмотрено четыре уровня изолированности: "грязное чтение", зафиксированное чтение, повторяемое чтение и сериализуемость. Соответственно, оператор SET TRANSACTION по стандарту имеет вид:
SET TRANSACTION {ISOLATION LEVEL {READ UNCOMMIED | READ COMMITED | REPEATABLE READ | SERIALIZABLE} | {READ ONLY | READ WRITE} | {DIAGNOSTICS SIZE число условий}}.,..;
Уровень изолированности snapshot может поддерживаться только "версионными" СУБД и стандартом SQL-92 он не регламентирован.
К сожалению, версионность, как способ изолированности транзакций, вообще плохо рассмотрен в серьезной литературе и, тем более, не имеет хорошей реализации. В современных СУБД применяют ограниченную версионность: одна транзакция-"писатель" и произвольное количество транзакций-"читателей". В полном варианте (много "писателей" и много "читателей") возможности управления транзакциями значительно шире, в частности, возможно реализовать полноценный механизм вложенных транзакций, предложенный Эллиотом Моссом еще в 1981 г. (позже Грей и Рэйтер развили идеи Э. Мосса см., например, J. Gray, A. Reuter Transaction Processing).
В свое время (порядка 10 лет назад) я поднимал этот вопрос в переписке с Джо Селко (руководителем комитета по стандартизации SQL), но ответа на свой вопрос не получил. Дело в том, что SQL, как средство моделирования, должен позволять имитировать реальные действия, не накладывая излишних ограничений. В жизни довольно часто встречаются ситуации, когда руководителю представляют несколько вариантов дальнейших действий, но гарантированно(!) принят (зафиксирован) может быть только один из этих вариантов. Это и позволяет сделать полноценная версионность. Можно рассмотреть дальнейшее развитие событий с подверсиями основных версий, тогда станет необходимым механизм, предложенный Э. Моссом.