Операция SQL Server и оператор SELECT - программирование
Подтвердить что ты не робот

Операция SQL Server и оператор SELECT

Я часто видел, как многие люди использовали оператор SELECT в транзакции. Я часто использую insert/update/delete только в транзакции. Я просто не понимаю, что такое утилита для размещения оператора SELECT внутри транзакции.

У меня есть один ответ, который.... SELECT внутри транзакции могут видеть изменения, сделанные другими предыдущими операторами insert/update/delete в этой транзакции, оператор SELECT вне транзакции не может.

Выше утверждение верно или нет?

Это единственная причина, по которой люди выставляют оператор SELECT внутри транзакции? При необходимости, пожалуйста, подробно обсудите все причины. спасибо

4b9b3361

Ответ 1

попробуйте сделать это, и вы поймете:

Откройте два новых запроса в SSMS (давайте назовем его A и B отныне одним) и на A, создайте простую таблицу следующим образом:

create table transTest(id int)
insert into transTest values(1)

сделайте следующее:

do select * from transTest в обоих из них. Вы увидите значение 1

В режиме ожидания:

set transaction isolation level read committed

В режиме B:

begin transaction
insert into transTest values(2)

В режиме ожидания:

select * from transTest

вы увидите, что запрос не завершится, поскольку он заблокирован транзакцией на A

В режиме B:

commit transaction

Вернитесь к A, и вы увидите, что завершенный запрос

Повторите тест с помощью set transaction isolation level read uncommitted на A вы увидите, что запрос не будет заблокирован транзакцией

Ответ 2

Одна из основных причин, по которой я могу думать (на самом деле, единственная причина) состоит в том, что вы хотите установить другой уровень изоляции, например:

USE AdventureWorks2008R2;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;

SELECT * FROM HumanResources.EmployeePayHistory;

SELECT * FROM HumanResources.Department;

COMMIT TRANSACTION;

Однако для отдельных операторов SELECT я не уверен, если у вас нет причин идти другим путем и устанавливать READ UNCOMMITTED в случаях, когда время ответа/максимизация concurrency важнее точных или достоверных данных.

< спекуляция определенности = "75%" > Если одиночный оператор SELECT находится внутри явной транзакции без изменения уровней изоляции, я уверен, что это не будет иметь никакого эффекта. Отдельные заявления сами по себе являются транзакциями, которые автоматически совершаются или откатываются при ошибке. </speculation>