Какой уровень изоляции используется для предотвращения чтения данных?

У меня такая ситуация.

Запрос такой.

Select * from TABLE where ID = 1 

(какой вопрос 🙂

после этого я изменяю материал в этой строке и вставляю его с новым идентификатором.

Я хочу, чтобы другие запросы не читали эту первую исходную строку из запроса , пока я не закончу чтение и вставку. После этого … вперед.

В основном я хочу, чтобы select и insert были в транзакции с уровнем изоляции, который предотвратит чтение только из этой строки, пока не будет завершена вставка.

OleDbTransaction работает, потому что я использую SQL Server 6.5 (о да, вы читаете это правильно, не спрашивайте, почему 🙂

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

Надеюсь, я был ясен 🙂

Благодарю.

Вы должны удерживать блокировку продолжительности транзакции. И исключительно.

Теперь я не уверен в правильности выбора SQL Server 6.5. Не работал с ним, так как, er, 199x

 BEGIN TRAN --edit, changed to XLOCK, ROWLOCK, HOLDLOCK SELECT * from TABLE WITH (XLOCK, ROWLOCK, HOLDLOCK) where ID = 1 ... INSERT COMMIT 

Редактировать:

Мое изменение направлено на блокировку единственной строки исключительно (с мелкой детализацией) до конца транзакции.

Тем не менее, IIRC ROWLOCK был добавлен с SQL Server 7 и 6.5 были только блокировки страниц. Но прошло какое-то время. У меня тогда были волосы и зубы 🙂

Описанная ситуация называется Phantom Read. Таким образом, вам нужна Serializable Isolation ( SERIALIZABLE )

Вам нужно поместить блокировку в строку: создать блокировку, прежде чем читать строку и освободить блокировку после обновления строки.

В Oracle и аналогичных базах данных чтение не блокируется, поэтому вам нужно сделать следующее (в транзакции):

 SELECT * FROM table WHERE id=? FOR UPDATE ... UPDATE table .... 

В MS SQL я не уверен, самый простой способ – попробовать следующее: открыть два окна, подключенные к базе данных, запустить транзакцию в обоих, сделать SELECT и посмотреть, можете ли вы сделать выбор из второго , Если инструкция не возвращается, это означает, что строка заблокирована, и вы хороши.

Я предполагаю, что в вашем вопросе вы хотите обновить строку после ее выбора, а не вставлять ее (вставка создает новую строку, обновление изменяет существующую строку)

  • Область транзакций с двумя методами подключения
  • Рефакторинг ADO.NET - SqlTransaction против TransactionScope
  • Требуется ли TransactionScope служба DTC?
  • Эта хорошая транзакция записи в хранимой процедуре
  • Как предотвратить тупик в хранимой процедуре SQL Server?
  • Почему этот конвертер не работает?
  • Блокировка SQL, вызывающая тайм-ауты
  • Явная блокировка таблицы (таблиц) в SQL Server?
  • В чем причина «контекста транзакции, используемого другим сеансом»,
  • Sql Notification Поддерживаемые уровни изоляции для транзакций
  • Выполнение нескольких SP, содержащих BEGIN TRANS - COMMIT TRANS, с использованием TransactionScope
  • Interesting Posts

    Как получить доступ к столбцам курсора без FETCH .. INTO

    Sql Выберите номера телефонов от многих до многих таблиц разных типов (мобильные, домашние)

    Получение значений из двух столбцов на основе разных условий

    CTE продолжает говорить, что тип не совпадает между якорем и рекурсивной частью

    Представления SQL Server

    Что не так в этом выражении select sql?

    Как заказать содержимое решения проекта в SQL Server Management Studio

    Как хранить многолетние 100 х 25 Гц временные ряды – Sql Server или базу данных сроков

    Как вставить несколько столбцов в таблицу с помощью OUTPUT в SQL Server?

    Проблема MS SQL. Ограничение длины поля.

    Создайте пользователя с разрешениями только для 1 базы данных

    Где лучшее место для SET NOCOUNT?

    Ведение состояния сеанса пользователя в приложении ASP.NET MVC, размещенном на веб-ферме

    T-SQL Добавьте новый столбец в существующую таблицу и заполните значение из двух других существующих столбцов

    Неявное преобразование производительности SQL и Dapper

    Давайте будем гением компьютера.