когда предпочесть пессимистическую модель изоляции транзакций над оптимистичной? - PullRequest
1 голос

Правильно ли я понимаю, что подсказки блокировки таблицы / строки используются для параллельных моделей изоляции пессимистических транзакций (TX) ONLY ?
Другими словами, когда можно использовать подсказки блокировки таблицы / строкиво время использования оптимистичной изоляции TX, предоставляемой SQL Server (2005 и выше)?

Когда в SQL Server2005 + понадобятся пессимистичные уровни / подсказки изоляции TX, если в более поздней версии предусмотрена встроенная оптимистическая (также известная как версия моментального снимка) изоляция параллелизма?нужно больше, хотя я сомневаюсь.

Кроме того, имея встроенные в SQL Server2005 + оптимистичные (также называемые снимками или версиями) уровни TX-изоляции, когда нужно было бы вручную кодировать функции оптимистичного параллелизма?

Последний вопрос вдохновлен прочтением:

описание пользовательского кодирования для обеспечения управления версиями в SQL Server.

Ответы [ 3 ]

5 голосов
/ 03 ноября 2010

Оптимистичный параллелизм требует больше ресурсов и стоит дороже при возникновении конфликта.

Два сеанса могут читать и изменять значения, и конфликт возникает только тогда, когда они пытаются применить свои изменения одновременно. Это означает, что в случае одновременного обновления оба значения должны храниться где-то (что, конечно, требует ресурсов).

Кроме того, при возникновении конфликта обычно необходимо откатить всю транзакцию или повторно установить курсор, что тоже дорого.

Модель пессимистического параллелизма использует блокировку, что снижает уровень параллелизма, но повышает производительность.

В случае двух одновременных задач для второй задачи может быть дешевле дождаться освобождения блокировки, чем тратить CPU время и диск I/O на две одновременные работы, а затем еще больше на откат менее удачливого работать и переделывать.

Скажем, у вас есть такой запрос:

UPDATE  mytable
SET     myvalue = very_complex_function(@range)
WHERE   rangeid = @range

, с very_complex_function чтением некоторых данных из самого mytable. Другими словами, этот запрос преобразует подмножество mytable с общим значением range.

Теперь, когда две функции работают в одном диапазоне, может быть два сценария:

  1. Пессимистично: первый запрос блокируется, второй запрос ждет его. Первый запрос завершается за 10 секунд, второй тоже. Итого: 20 секунд.

  2. Оптимистично: оба запроса работают независимо (на одном входе). Это делит CPU время между ними плюс некоторые накладные расходы на переключение. Они должны где-то хранить свои промежуточные данные, поэтому данные хранятся дважды (что подразумевает дважды I/O или память). Допустим, оба завершены почти одновременно, за 15 секунд.

    Но когда пришло время зафиксировать работу, второй запрос будет конфликтовать и должен будет откатить свои изменения (скажем, это займет те же самые 15 секунд). Затем необходимо снова перечитать данные и снова выполнить работу с новым набором данных (10 секунд).

    В результате оба запроса завершаются позже, чем с пессимистической блокировкой: 15 и 40 секунд против 10 и 20.

Когда в SQL Server2005 + понадобятся пессимистичные уровни / подсказки изоляции TX +, если позднее предусмотрена встроенная оптимистическая (или снимок или версия) изоляция параллелизма?

Оптимистичные уровни изоляции, ну, в общем, оптимистичные. Вам не следует использовать их, когда вы ожидаете высокой конкуренции за ваши данные.

Кстати, оптимистическая изоляция (для запросов на чтение) была доступна и в SQL Server 2000.

2 голосов
/ 04 ноября 2010

У меня есть подробный ответ здесь: Разработка модификаций, сохраняющих параллелизм

0 голосов
/ 03 ноября 2010

Я думаю, что здесь есть некоторая путаница с терминологией.

Техника оптимистической блокировки / оптимистического параллелизма / ... - это метод программирования , используемый для избежания следующего сценария:

  • начать транзакцию
  • читать данные, устанавливая блокировку «чтения» для них, чтобы предотвратить любое удаление / изменение наших данных
  • отображать данные на экране пользователя
  • ожидание ввода пользователя, блокировка остается активной
  • продолжение ожидания ввода пользователя, блокировка по-прежнему предотвращает любые записи / изменения
  • ввод пользователя никогда не происходит (по какой-либо причине)
  • время транзакцииout (и это обычно происходит не очень быстро, поскольку пользователю необходимо предоставить разумное время для ввода своего ввода).

Оптимистическая блокировка заменяет это следующим:

  • начать транзакцию READ
  • читать данные, установив для них блокировку «чтения», чтобы предотвратить любые удаления / изменения наших данных
  • завершить транзакцию READ, сняв блокировку чтения простоt
  • отображать данные на экране пользователя
  • ждать ввода пользователя, но данные могут быть изменены / удалены с помощью других транзакций
  • поступает ввод пользователя
  • начать транзакциюWRITE
  • проверяет, что данные остались неизменными, вызывая исключение, если они
  • применяют пользовательские обновления
  • завершают транзакцию WRITE

Так чтоОдна «пользовательская транзакция» для извлечения некоторых данных, их изменения и обновления состоит из двух отдельных «транзакций базы данных».То, что обычно называют «уровнями изоляции», применяется к этим транзакциям базы данных.«Оптимистическая блокировка», на которую вы ссылаетесь, применяется к «пользовательской транзакции».

Ситуация еще более усложняется тем, что, вообще говоря, возможны две совершенно разные стратегии для «изоляции части транзакций базы данных»:

  • MVCC
  • 2-фазная блокировка

Я думаю, что «уровень изоляции версий снимков» означает, что метод MVCC (ну, один из его различныхвозможные варианты) используется для транзакции базы данных.Другие широко известные уровни изоляции применяются в большей степени к изоляции транзакций с использованием 2PL в качестве метода сериализации (/ изоляции).(И смешивание их может запутаться ...)

...