Включает ли SQL Server выбор … Ввод запросов в неявную транзакцию?
Когда я выполняю запрос select / Insert, SQL Server автоматически создает неявную транзакцию и, таким образом, обрабатывает ее как одну атомную операцию?
Возьмите следующий запрос, который вставляет значение в таблицу, если оно еще не существует:
INSERT INTO Table1 (FieldA) SELECT 'newvalue' WHERE NOT EXISTS (Select * FROM Table1 where FieldA='newvalue')
Есть ли возможность добавления «newvalue» в таблицу другим пользователем между оценкой предложения WHERE и выполнением предложения INSERT, если он явно не заключен в транзакцию?
- Что здесь происходит? SQL Server - XACT_ABORT ON + @@ ERROR Проверка. ,
- Как гарантировать целостность транзакций в SQL Server 2005
- Должна ли быть транзакция для чтения запросов?
- применение транзакций sql на последующих шагах
- Как получить следующий идентификатор из таблицы БД без столбца IDENTITY или GUID
- Как уменьшить рост журнала транзакций для обновленных обновлений nvarchar (max)
- Каков наилучший способ устранения длительных хранимых процедур?
- Linq to Sql Добавить и удалить в той же транзакции
- Пакет SSIS замерзает после установки транзакции контейнера «Требуется»
- SQL Server: транзакция хранимой процедуры
- Блокировка SQL Server tempdb
- Поддерживает ли Sql Server 2000 транзакции SSIS?
- Почему эти два заявления sql запираются? (График взаимоблокировки + детали включены)
Вы смешиваете транзакцию и блокировку. Transaction возвращает ваши данные обратно в исходное состояние, если есть какая-либо ошибка. Если нет, он переместит данные в новое состояние. Вы никогда не будете иметь свои данные в прерывистом состоянии при выполнении операций. С другой стороны, блокировка – это та, которая позволяет или позволяет нескольким пользователям одновременно обращаться к данным. Чтобы ответить на ваш вопрос, выберите … insert is atomic и до тех пор, пока никакие гранулированные блокировки не будут запрошены явно, ни один другой пользователь не сможет вставить, пока будет выбран параметр … insert.
Джон, ответ на это зависит от вашего текущего уровня изоляции. Если вы настроены на READ UNCOMMITTED, вы можете искать проблемы, но с более высоким уровнем изоляции вы не должны получать дополнительные записи в таблице между выбором и вставкой. С READ COMMITTED (по умолчанию), REPEATABLE READ или SERIALIZABLE уровнем изоляции вы должны быть защищены.
Очень распространенная проблема. Объясняется здесь:
Оборонительное программирование базы данных: исключение операторов IF