Включает ли SQL Server выбор … Ввод запросов в неявную транзакцию?

Когда я выполняю запрос select / Insert, SQL Server автоматически создает неявную транзакцию и, таким образом, обрабатывает ее как одну атомную операцию?

Возьмите следующий запрос, который вставляет значение в таблицу, если оно еще не существует:

INSERT INTO Table1 (FieldA) SELECT 'newvalue' WHERE NOT EXISTS (Select * FROM Table1 where FieldA='newvalue') 

Есть ли возможность добавления «newvalue» в таблицу другим пользователем между оценкой предложения WHERE и выполнением предложения INSERT, если он явно не заключен в транзакцию?

Вы смешиваете транзакцию и блокировку. Transaction возвращает ваши данные обратно в исходное состояние, если есть какая-либо ошибка. Если нет, он переместит данные в новое состояние. Вы никогда не будете иметь свои данные в прерывистом состоянии при выполнении операций. С другой стороны, блокировка – это та, которая позволяет или позволяет нескольким пользователям одновременно обращаться к данным. Чтобы ответить на ваш вопрос, выберите … insert is atomic и до тех пор, пока никакие гранулированные блокировки не будут запрошены явно, ни один другой пользователь не сможет вставить, пока будет выбран параметр … insert.

Джон, ответ на это зависит от вашего текущего уровня изоляции. Если вы настроены на READ UNCOMMITTED, вы можете искать проблемы, но с более высоким уровнем изоляции вы не должны получать дополнительные записи в таблице между выбором и вставкой. С READ COMMITTED (по умолчанию), REPEATABLE READ или SERIALIZABLE уровнем изоляции вы должны быть защищены.

Очень распространенная проблема. Объясняется здесь:

Оборонительное программирование базы данных: исключение операторов IF

  • SQL Server и TransactionScope (с MSDTC): спорадически не удается получить соединение
  • Пуленепробиваемый подход для решения тайм-аутов транзакций SQL
  • Как конвертировать транзакции ADO.NET, а не транзакции SQL Server?
  • Как получить доступ к удаленным строкам родительской таблицы в дочернем триггере
  • Время транзакции транзакции сервера Sql
  • Является ли хорошей практикой всегда использовать TransactionScope в базовом классе DAL?
  • Причина для System.Transactions.TransactionInDoubtException
  • Убедитесь, что вставка происходит с несколькими таблицами
  • SQL Server 2012 - Как работает уровень изоляции «Повторяемый Чтение»?
  • Сделка не откат
  • Как предотвратить блокировку транзакций в SQL Server для всех соединений?
  • Давайте будем гением компьютера.