Как заблокировать определенные строки SQL во время выполнения над ними процесса?

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

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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
6 914
4

Ответы 4

Добавить

with (rowlock)

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

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

Обновлено: ок, неправильно понял вопрос. Вам нужна изоляция транзакции. +1 Джоэлю :)

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

вот пример

SELECT address1 , city, country
FROM location
FOR UPDATE;

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

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

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

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

оберните его в tran, используйте holdlock + updlock в выборе

пример

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


processing here

commit

Другие вопросы по теме