none
Одновременная запись в БД на ASP.NET WebForms RRS feed

  • Вопрос

  • Коллеги здравствуйте. Возник следующий вопрос, на который я так и не нашел очевидного ответа в MSDN или интернете.

    Представим, что существуют 2 пользователя вэб-приложения, которые ведут какую-то одну интересующую их запись в БД.

    В конкретный момент времени, редактировать данную запись может только 1 человек. Поэтому в БД у записи есть специальное поле Lock, которое указывает, что запись находится в режиме редактирования. И пока этот Lock = 1, второму пользователю инструменты редактирования не доступны.

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

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

    1. Первый пользователь нажал блокировку, второй на миллисекунду позже после него.

    2. Запрос пришел на сервер. Первый пользователь проверил объект на блокировку. Ее нет, и пошла подготовительная часть для блокировки в БД. И затем, если я правильно понимаю, происходит переключение на процесс (???поток???) второго пользователя, который также проверил блокировку, и не нашел ее, и следом также пошел выполнять свою блокировку. Т.е. в итоге получится, что сначала выполнится запись в БД пользователя №1, а затем и пользователя №2, хотя первый инициировал это действие раньше.

    Само собой напрашивается в таком случае использовать к примеру оператор "lock" всей функции обработчика, чтобы пользователь №2 ожидал конца атомарной операции проверки блокировки и, в случае чего, ее изменения от пользователя №1. Но опять же, не совсем понимаю, на какой в таком случае объект необходимо будет повесить этот лок. Статичную защищенную переменную, или достаточно обычной внутренней переменной на странице. Т.е. нет четкого понимания, запускается ли у нас жизненный цикл страницы в разных потоках одного процесса, или для каждого пользователя создан свой процесс...

    Как правильно реализовать данный момент, особенно с переменной, которая является объектом для блокировки.

    Заранее спасибо.

    28 октября 2011 г. 17:53

Ответы

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

    Если ошибаюсь - поправьте. Если есть что дополнить, дополните. Буду признателен услышать как вы решаете подобные задачи.

    • Помечено в качестве ответа Eugene_Olisevich 30 октября 2011 г. 7:27
    28 октября 2011 г. 19:30
  • > необходимо ли какими-то своими силами проводить синхронизацию через критическую секцию того момента, когда пользователь попытается заблокировать запись?


    см. Типы управления параллелизмом в SQL Server

    • Помечено в качестве ответа Eugene_Olisevich 30 октября 2011 г. 7:27
    28 октября 2011 г. 19:44

Все ответы

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

    Если ошибаюсь - поправьте. Если есть что дополнить, дополните. Буду признателен услышать как вы решаете подобные задачи.

    • Помечено в качестве ответа Eugene_Olisevich 30 октября 2011 г. 7:27
    28 октября 2011 г. 19:30
  • > необходимо ли какими-то своими силами проводить синхронизацию через критическую секцию того момента, когда пользователь попытается заблокировать запись?


    см. Типы управления параллелизмом в SQL Server

    • Помечено в качестве ответа Eugene_Olisevich 30 октября 2011 г. 7:27
    28 октября 2011 г. 19:44
  • После нехитрых манипуляций с возможными вариантами пришел к логическому решению, что переменную-флаг для lock следует объявлять с модификаторам private static, потому как если ее делать просто private, то это дает естественно два разных инстанса класса, и лок не срабатывает на межпотоковом пространстве.

    Вы правы, так и есть. Спасибо что написали решение проблемы и отметили ответ.


    Для связи [mail]
    1 ноября 2011 г. 6:32
    Модератор