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