2012-03-18 3 views
0

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

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

Любые идеи?

+0

Не могли бы вы показать нам какой-нибудь код? –

+0

Чтобы синхронизировать разные страницы (или любые клиенты) с доступом к тем же данным, вам необходимо использовать блокировки базы данных. Какую базу данных вы используете? – Strillo

+0

Я использую MS SQL 2008, использовать набор данных ADO.NET для чтения данных и обновления. –

ответ

2

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

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

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx

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

static object lockObject = new Object(); 
static bool inProgress = false; 

static void MyProcess() 
{ 
    if(inProgress) return; 

    lock(lockObject) 
    { 
    try{ 
     inProgress = true; 
     // critical code here 
    } 
    finally 
    { 
     inProgress = false; 
    } 
    } 
} 
1

Используйте соответствующий уровень изоляции и блокировки базы данных: они гарантируют правильную обработку любого клиента (любая транзакция, если быть точным), и целостность данных (проверьте isolation levels).

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

Смежные вопросы