Управление параллелизмом

Параллелизм — это возможность двух транзакций одновременно использовать одни и те же данные, и при повышенной изоляции транзакций обычно возникает снижение параллелизма. Это связано с тем, что изоляция транзакций обычно реализуется путем блокировки строк, и по мере блокировки строк меньшее количество транзакций может быть завершено без блокировки по крайней мере временно заблокированной строкой. Хотя снижение параллелизма обычно считается компромиссом для более высоких уровней изоляции транзакций, необходимых для поддержания целостности базы данных, это может стать проблемой в интерактивных приложениях с высокой активностью чтения и записи, которая использует курсоры.

Например, предположим, что приложение выполняет инструкцию SQL SELECT * FROM Orders. Он вызывает SQLFetchScroll для прокрутки результирующий набор и позволяет пользователю обновлять, удалять или вставлять заказы. После обновления, удаления или вставки заказа приложение фиксирует транзакцию.

Если уровень изоляции является повторяемым, транзакция может ( в зависимости от способа его реализации) заблокировать каждую строку, возвращаемую SQLFetchScroll. Если уровень изоляции сериализуем, транзакция может заблокировать всю таблицу Orders. В любом случае транзакция освобождает свои блокировки только при фиксации или откате. Таким образом, если пользователь тратит много времени на чтение заказов и очень мало времени обновления, удаления или вставки, транзакция может легко заблокировать большое количество строк, что делает их недоступными для других пользователей.

Это проблема, даже если курсор доступен только для чтения, и приложение позволяет пользователю читать только существующие заказы. В этом случае приложение фиксирует транзакцию и освобождает блокировки при вызове SQLCloseCursor (в режиме автоматической фиксации) или SQLEndTran (в режиме ручной фиксации).

Этот раздел содержит следующие подразделы.