Гибернация и параллелизм - PullRequest
4 голосов
/ 09 июля 2010

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

Два клиента F (быстрый) и S (медленный) получают доступ к базе данных и могут изменять одни и те же объекты.

Теперь еще одно дополнительное требование: для приложения крайне важно, чтобы клиент F выполнял так быстронасколько это возможно.

Как бы вы решили проблему?

Моя проблема с оптимистической блокировкой: предположим, что F пытается обновить свои изменения, но не может сделать это успешно,потому что S уже обновил свои данные.Исключение (StaleObjectStateException) будет выброшено из спящего режима.Я поймаю это исключение, объединю изменения и снова попробую точно такую ​​же транзакцию, верно?Тогда мне не нравится случай, когда F повторяет свои транзакции до тех пор, пока он не будет успешным, и поэтому F может теоретически блокировать длительное время.Должен ли я игнорировать это и надеяться, что это условие редко встречается на практике?Или я могу дать своим клиентам что-то вроде приоритета блокировки базы данных?

Другие пользователи могут жить с этими проблемами:

StaleObjectStateException (оптимистическая блокировка)... мы получаем 3 исключения на 10000 звонков.

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Перехватите исключение StaleObjectException: s и увеличьте приоритет потока, который должен быть быстрее. StaleObjectException: s должно быть редко. Посмотрите на пессимистическую блокировку, если она не работает для вас.

0 голосов
/ 09 июля 2010

Первое, что бросается в глаза, это то, что если у вас есть требование, чтобы A + B работал как можно быстрее, вы получите значительное замедление при отлове и обработке исключений. Этот процесс очень медленный.

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

...