Оптимистическая и пессимистическая блокировка



Я понимаю разницу между оптимистической и пессимистической блокировкой*. Теперь может кто-нибудь объяснить мне, когда я буду использовать любой из них вообще?



и меняется ли ответ на этот вопрос в зависимости от того, использую ли я хранимую процедуру для выполнения запроса?



*но просто чтобы проверить, оптимистический означает "не блокировать таблицу во время чтения" и пессимистический означает "заблокировать таблицу во время чтения."

867   8  

8 ответов:

Оптимистическая Блокировка - это стратегия, в которой Вы читаете запись, записываете номер версии (другие методы для этого включают даты, временные метки или контрольные суммы/хэши) и проверяете, что версия не изменилась, прежде чем записывать запись обратно. Когда вы записываете запись обратно, вы фильтруете обновление версии, чтобы убедиться, что оно атомарное. (т. е. не был обновлен между тем, когда вы проверяете версию и записываете запись на диск) и обновите версию в одном удар.

Если запись загрязнена (т. е. отличается от вашей версии), вы прерываете транзакцию, и пользователь может повторно запустить ее.

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

Пессимистической Блокировки - это когда вы блокируете запись для вашего исключительного использования, пока вы не закончите с ним. Он имеет гораздо лучшую целостность, чем оптимистическая блокировка, но требует, чтобы Вы были осторожны с дизайном приложения, чтобы избежать взаимоблокировок. Для использования пессимистической блокировки вам нужно либо прямое подключение к базе данных (как это обычно бывает в двухуровневый клиент-сервер приложения) или внешний идентификатор транзакции, который можно использовать независимо от соединения.

в последнем случае вы открываете транзакцию с TxID, а затем повторно подключаетесь с помощью этого идентификатора. СУБД поддерживает блокировки и позволяет вам забрать сеанс обратно через TxID. Именно так распределяются транзакции с использованием двухфазных протоколов фиксации (таких как XA или транзакции com+) работы.

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

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

чтобы выбрать правильный механизм блокировки, вы должны оценить количество операций чтения и записи и планировать соответственно

оптимистичный предполагает, что ничего не изменится, пока вы читаете это.

пессимистично предполагает, что что-то будет и поэтому блокирует его.

Если это не важно, что данные прекрасно читаются использовать оптимистичный. Вы можете получить странное "грязное" чтение, но это гораздо менее вероятно приведет к тупикам и тому подобное.

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

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

О, и Microsoft SQL server по умолчанию для блокировки страниц - в основном строка, которую Вы читаете, и несколько с обеих сторон. Блокировка строк является более точным, но гораздо медленнее. Часто стоит настроить транзакции на чтение-фиксацию или без блокировки, чтобы избежать взаимоблокировок во время чтение.

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

вы платите свои деньги и т. д

Я бы подумал еще об одном случае, когда пессимистическая блокировка была бы лучшим выбором.

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

есть в основном два самых популярных ответа. Элемент первый в основном говорит

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

другой ответ

оптимистический (версионный) быстрее из-за отсутствия блокировки, но (пессимистический) блокировка работает лучше, когда конкуренция высока, и лучше предотвратить работу, а не отбросить ее и начать все сначала.

или

оптимистичная блокировка работает лучше всего, когда у вас есть редкие столкновения

С на этой странице.

Я создал свой ответ, чтобы объяснить, как" сохранить соединение "связано с"низкими столкновениями".

чтобы понять, какая стратегия лучше для вас, подумайте не о транзакциях в секунду, которые имеет ваша БД, а о продолжительности одной транзакции. Обычно вы открываете trasnaction, выполняете операцию и закрываете транзакцию. Это короткая, классическая транзакция, которую Анси имел в виду и прекрасно справлялся с блокировкой. Но, как же внедрить систему бронирования билетов, где много клиенты бронируют одни и те же номера/места одновременно?

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

вы вместо этого можно заблокировать все параметры, когда вы их читаете. Это пессимистичный сценарий. Вы понимаете, почему это отстой. Ваша система может быть сбита одним клоуном, который просто начинает бронирование и идет курить. Никто не может ничего зарезервировать до того, как он закончит. Ваш денежный поток падает до нуля. Именно поэтому в реальности используются оптимистические оговорки. Те, кто медлит слишком долго, должны перезапустить свое бронирование по более высоким ценам.

в этом оптимистичном подходе вы должны записать все данные что Вы читаете (как в мое повторное чтение) и приходите к точке фиксации с вашей версией данных (я хочу купить акции по цене, которую вы указали в этой котировке, а не по текущей цене). На этом этапе создается транзакция ANSI, которая блокирует БД, проверяет, не изменилось ли что-либо, и фиксирует/прерывает вашу операцию. ИМО, это эффективная эмуляция MVCC, который также связан с оптимистичным CC и также предполагает, что ваша транзакция перезапускается в случае прерывания, что вы сможете сделать новый заказ. Транзакция здесь включает в себя решения человека-пользователя.

Я далек от понимания того, как реализовать MVCC вручную, но я думаю, что долгосрочные транзакции с опцией перезапуска являются ключом к пониманию предмета. Поправьте меня, если я где-то ошибаюсь. Мой ответ был мотивирован это Алексей Кузнецов глава.

в большинстве случаев оптимистичная блокировка более эффективна и обеспечивает более высокую производительность. При выборе между пессимистической и оптимистической блокировкой следует учитывать следующее:

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

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

  • Оптимистическая блокировка полезна, если существует возможность конфликтов очень низкий-есть много записей, но относительно мало пользователей, или очень мало обновлений и в основном операций чтения типа.

один из вариантов использования для оптимистической блокировки заключается в том, чтобы ваше приложение использовало базу данных, чтобы позволить одному из ваших потоков / хостов "утверждать" задачу. Это метод, который пригодился мне на регулярной основе.

лучший пример, который я могу придумать, - это очередь задач, реализованная с использованием базы данных, с несколькими потоками, претендующими на задачи одновременно. Если задача имеет статус "доступно", "заявлено", "завершено", запрос БД может сказать что-то вроде "установить статус= "заявлено", где статус= 'доступно'. Если несколько потоков пытаются изменить состояние таким образом, все, кроме первого потока не удастся из-за грязных данных.

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

Comments

    Ничего не найдено.