Какой уровень изоляции используется для предотвращения чтения данных?
У меня такая ситуация.
Запрос такой.
Select * from TABLE where ID = 1
(какой вопрос 🙂
- TABLOCK для оптимизации ведения журнала транзакций для оператора insert select
- Невозможно выполнить операцию резервного копирования или восстановления внутри транзакции. BACKUP DATABASE заканчивается аномально
- node.js: создание транзакции, которая охватывает вызовы в несколько хранилищ
- Получить «следующую» строку из базы данных SQL Server и пометить ее в отдельной транзакции
- Почему вставка 1M записей медленнее без транзакции, чем внутри транзакции?
после этого я изменяю материал в этой строке и вставляю его с новым идентификатором.
Я хочу, чтобы другие запросы не читали эту первую исходную строку из запроса , пока я не закончу чтение и вставку. После этого … вперед.
В основном я хочу, чтобы select и insert были в транзакции с уровнем изоляции, который предотвратит чтение только из этой строки, пока не будет завершена вставка.
OleDbTransaction
работает, потому что я использую SQL Server 6.5 (о да, вы читаете это правильно, не спрашивайте, почему 🙂
Я искал описание уровней изоляции, но не могу понять их и найти решение для своей проблемы, поэтому мой вопрос заключается в том, какой уровень изоляции использовать для OleDbTransaction
?
Надеюсь, я был ясен 🙂
Благодарю.
- Сообщения сервис-брокера внутри транзакции
- SQL Server: удаление строк с ограничениями внешнего ключа: могут ли транзакции переопределять ограничения?
- SQL Server - таблица, кажется, заблокирована
- Должен ли вести журнал журналов транзакций так же быстро, как и диск базы данных?
- Как синхронизировать транзакции
- В спящем режиме, как программно установить уровень изоляции транзакции или как создать две транзакции с разными уровнями изоляции
- База данных учета - хранение кредита и дебет?
- Использует ли SqlBulkCopy Enlist в Ambient Transaction?
Вы должны удерживать блокировку продолжительности транзакции. И исключительно.
Теперь я не уверен в правильности выбора 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 и посмотреть, можете ли вы сделать выбор из второго , Если инструкция не возвращается, это означает, что строка заблокирована, и вы хороши.
Я предполагаю, что в вашем вопросе вы хотите обновить строку после ее выбора, а не вставлять ее (вставка создает новую строку, обновление изменяет существующую строку)