Как заблокировать определенные строки SQL при запуске процесса на них? - PullRequest
1 голос
/ 05 сентября 2008

У моей работы есть финансовое приложение, написанное в VB.NET с SQL, над которым могут работать несколько пользователей одновременно.

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

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

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

Есть ли способ заблокировать только те записи, с которыми, как мне известно, нужно работать, из кода VB.NET?

Ответы [ 4 ]

2 голосов
/ 05 сентября 2008

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

вот пример

SELECT address1 , city, country
FROM location
FOR UPDATE;
1 голос
/ 05 сентября 2008

Вы, вероятно, хотите установить уровень изоляции для всей транзакции, а не использовать с (rowlock) для определенных таблиц.

Посмотрите на эту страницу:
http://msdn.microsoft.com/en-us/library/ms173763.aspx

В частности, поищите в нем «блокировку строки», и я думаю, вы обнаружите, что READ COMMITTED или REPEATABLE READ - это то, что вам нужно. READ COMMITTED - это сервер SQL по умолчанию. Если READ COMMITTED не кажется вам достаточно сильным, перейдите к REPEATABLE READ.

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

0 голосов
/ 09 сентября 2008

оберните его в транс, используйте блокировку + обновление в выбранном

пример

begin tran
select * from
SomeTable (holdlock,updlock)
where ....


processing here

commit
0 голосов
/ 05 сентября 2008

добавить

with (rowlock)

к вашему запросу SQL

Статья о производительности SQL Server

РЕДАКТИРОВАТЬ: хорошо, я неправильно понял вопрос. То, что вы хотите, это изоляция транзакции. +1 к Джоэлу :)

...