Предположим, транзакция в одной программе обновляет данные в многопользовательской базе геоданных, но перед фиксацией транзакции другая программа считывает те же данные. Будет ли вторая программа считывать новые, но незафиксированные данные, или она будет считывать старые данные? Ответ зависит от уровня изоляции транзакции.
Если транзакция позволяет другим программам считывать незафиксированные данные, вторая программа будет считывать обновленные данные. Это может повысить производительность, поскольку второй программе не нужно ждать завершения транзакции, чтобы прочитать данные. Но есть решение: если вторая программа считывает данные, которые окончательно не зафиксированы, она может считать неверные данные, либо данные, которых не существует.
Чтобы пользователи могли выбирать, что лучше для их приложения, СУБД предоставляют уровни изоляции, определяющие, как последующие процессы должны быть изолированы от других одновременно выполняющихся процессов. Уровни изоляции могут быть установлены администратором базы данных и применяться ко всем транзакциям в базе данных. Они также могут быть установлены в приложении или перед отдельной транзакцией. Уровень изоляции определяет следующее:
- Степень, в которой строки, считываемые и обновляемые приложением, доступны для других одновременно выполняющихся процессов
- Степень, в которой приложению доступны обновления из других одновременно выполняющихся процессов приложения
СУБД позволяют установить один из четырех уровней изоляции, перечисленных ниже, от самого низкого до самого высокого уровня изоляции. Каждый уровень добавляет к объектам предыдущего уровня. Более высокие уровни изоляции обеспечивают большую степень целостности данных, но за счет снижения параллелизма, поскольку они дольше удерживают блокировки.
UNCOMMITTED READ: обеспечивает минимальную изоляцию от параллельных транзакций. Транзакция может считывать данные, которые были изменены параллельными транзакциями, еще до их фиксации.
COMMITTED READ: транзакция будет считывать только зафиксированные данные; она не будет считывать незафиксированные данные.
REPEATABLE READ: устанавливает дополнительное ограничение, которое применяется, когда одни и те же строки считываются несколько раз в ходе транзакции. Это гарантирует, что при последующем чтении одних и тех же строк они будут одинаковыми.
SERIALIZABLE: гарантирует, что при повторном чтении одних и тех же строк они будут одинаковыми. Все операции чтения в транзакции видят только данные, зафиксированные до начала транзакции, и никогда не видят одновременных изменений транзакции, зафиксированных во время выполнения транзакции.
Ваша СУБД может ссылаться на них под другими именами. Каждый уровень работает одинаково во всех СУБД, но есть важные различия. Чтобы избежать ошибок в разработке приложений и рабочих процессов, обязательно поймите, как уровни изоляции влияют на блокировку и параллелизм в вашей СУБД. Дополнительную информацию смотрите в документации по вашей СУБД.
Для получения информации о том, как уровни изоляции применяются к ArcGIS, а также о потенциальных проблемах параллелизма, см. раздел Параллелизм и блокировка.