Параллелизм курсоров (компонент Database Engine)
MicrosoftSQL Server поддерживает четыре параметра параллелизма для серверных курсоров:
READ_ONLY
OPTIMISTIC WITH VALUES
OPTIMISTIC WITH ROW VERSIONING
SCROLL LOCKS
READ_ONLY
Установленное обновление через курсоры запрещено, блокировка строк, составляющих результирующий набор, не удерживается.OPTIMISTIC WITH VALUES
Управление оптимистичным параллелизмом — это стандартный раздел теории управления транзакциями. Управление оптимистичным параллелизмом используется в ситуациях, когда существует лишь небольшая вероятность того, что другой пользователь или процесс могут обновить строку в период между открытием курсора и обновлением строки. Если курсор открывается с этим параметром, то блокировка базовых строк не удерживается, что позволяет максимально увеличить пропускную способность. Если пользователь пытается изменить строку, то ее текущие значения сравниваются со значениями, полученными во время последней выборки этой строки. Если какое-либо значение изменилось, то сервер определяет, что другой пользователь или процесс уже обновил эту строку, и возвращает ошибку. Если значение остается прежним, то сервер выполняет изменение.Выбирая этот параметр параллелизма, пользователь или программист берет на себя ответственность за обработку редких ошибок, указывающих, что строку изменил другой пользователь. Если такую ошибку получает приложение, то оно, как правило, обновляет курсор, получает новые значения и предоставляет пользователю решать, следует ли изменять новые значения. Столбцы text, ntext и image не используются при сравнении параллелизма в SQL Server 6.5 или более ранних версий.
OPTIMISTIC WITH ROW VERSIONING
Этот параметр управления оптимистичным параллелизмом основан на управлении версиями строк. При управлении версиями строк базовая таблица должна иметь идентификатор версии такого типа, по которому сервер может определить наличие изменений после считывания строки в курсор. В SQL Server эту возможность обеспечивает тип данных timestamp, который является двоичным числом, указывающим относительную последовательность изменений в базе данных. У каждой базы данных есть текущее глобальное значение временной метки **@@**DBTS. При каждом изменении строки в столбце timestamp, SQL Server сохраняет текущее значение **@@**DBTS в столбце timestamp, затем увеличивает значение **@@**DBTS. Если таблица содержит столбец timestamp, то временные метки переводятся на уровень строки. Сервер может выявлять изменения, сравнивая текущее значение временной метки строки со значением временной метки, сохраненной при последней выборке этой строки. Серверу не нужно сравнивать значения всех столбцов — только столбца timestamp. Если приложение запрашивает оптимистичный параллелизм с управлением версиями строк в таблице, не содержащей столбца timestamp, то курсор получает управление оптимистичным параллелизмом на основе значений.Примечание Для курсоров, открытых в удаленных источниках данных, обновления через курсор не поддерживаются, если удаленный источник данных не имеет столбца с временными метками.
SCROLL LOCKS
Этот параметр реализует управление пессимистичным параллелизмом, при котором приложение пытается блокировать базовые строки, в то время как они считываются в результирующий набор курсора. При использовании серверных курсоров блокировка обновления помещается в строку, если она считывается в курсор. Если курсор открыт в транзакции, то блокировка обновления удерживается до фиксации или отката транзакции. Блокировка курсора снимается при выборке следующей строки. Если курсор открыт вне транзакции, то блокировка снимается при выборке следующей строки. Поэтому если пользователю требуется полное управление пессимистичным параллелизмом, то курсор следует открывать в транзакции. Блокировка обновления препятствует тому, чтобы другие задания получали блокировку обновления или монопольную блокировку, не позволяя тем самым обновлять строки любой другой задаче. Однако блокировка обновления не блокирует разделяемую блокировку, поэтому она не мешает другим задачам считывать строки, если она также не запрашивает операцию считывания с блокировкой обновления.
Блокирование прокрутки
Этот параметр параллелизма курсоров может блокировать прокрутку в зависимости от подсказок блокировки, заданных в инструкции SELECT в определении курсора. Прокрутка всех строк выборки блокируется, и эта блокировка удерживаются до следующей выборки или до закрытия курсора. При следующей выборке курсор блокирует строки в новой выборке, затем снимает блокировку строк в предыдущей выборке. Блокирование прокрутки не зависит от блокировки транзакций и может сохраняться после операций фиксации или отката. Если параметр закрытия курсора после фиксации отключен, то инструкция COMMIT не закрывает открытые курсоры, и блокирование прокрутки удерживается после фиксации. При этом сохраняется изоляция данных выборки.
Тип полученного блокирования прокрутки зависит от параметра параллелизма курсора и подсказок блокировки в инструкции SELECT для этого курсора.
Примечание |
---|
Блокирование прокрутки поддерживается только для курсоров, управляемых набором ключей, а также для динамических курсоров. |
Подсказки блокировки |
Только для чтения |
Оптимистичная со значениями |
Оптимистичная с управлением версиями строк |
Блокирование |
---|---|---|---|---|
Нет подсказок |
- |
- |
- |
Обновление |
NOLOCK* |
- |
- |
- |
- |
HOLDLOCK |
- |
- |
- |
Обновление |
UPDLOCK |
- |
- |
- |
Обновление |
TABLOCKX |
- |
- |
- |
Обновление |
Все остальные |
- |
- |
- |
Обновление |
*Если для таблицы задана подсказка NOLOCK, то эта таблица будет доступна только для чтения через курсор.
Настройка параметров параллелизма курсоров
Параметры параллелизма задаются по-разному в каждой среде курсора.
Курсоры Transact-SQL
Укажите ключевые слова READ_ONLY, SCROLL_LOCK и OPTIMISTIC в инструкции DECLARE CURSOR. Ключевое слово OPTIMISTIC задает оптимистичный параллелизм с управлением версиями строк, курсоры Transact-SQL не поддерживают оптимистичный параллелизм с параметром параллелизма на основе значений.
Приложения ADO
Укажите adLockReadOnly, adLockPessimistic, adLockOptimistic или adLockBatchOptimistic в свойстве LockType объекта Recordset.
Приложения ODBC
В качестве значений атрибута инструкции SQL_ATTR_CONCURRENCY задайте SQL_CONCUR_READ_ONLY, SQL_CONCUR_ROWVER, SQL_CONCUR_VALUES или SQL_CONCUR_LOCK.