SQL Server事务和SELECT语句

Tho*_*mas 17 sql-server

我经常看到很多人SELECT在交易中使用陈述.我经常insert/update/delete只在交易中使用.我只是不明白将一个SELECT语句放在事务中的效用是什么.

我得到了一个答案...... SELECT在事务内部可以看到该事务中其他先前Insert/Update/Delete语句所做的更改,事务SELECT外部的语句不能.

以上陈述是真的还是不真实?

这是人们将SELECT声明置于交易中的唯一原因吗?如果可能,请详细讨论所有原因.谢谢

Die*_*ego 19

尝试这样做,你会明白:

在SSMS上打开两个新查询(从现在开始称之为A和B),在A上创建一个如下所示的简单表:

create table transTest(id int)
insert into transTest values(1)
Run Code Online (Sandbox Code Playgroud)

现在,执行以下操作:

做到select * from transTest这两点.您将看到值1

在奔跑:

set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)

在B运行:

begin transaction
insert into transTest values(2)
Run Code Online (Sandbox Code Playgroud)

在奔跑:

select * from transTest

您将看到查询不会完成,因为它被A上的事务锁定

在B运行:

commit transaction
Run Code Online (Sandbox Code Playgroud)

回到A,您将看到查询完成

set transaction isolation level read uncommitted在A上重复测试, 您将看到查询不会被事务锁定


Qui*_*ith 6

我能想到的主要原因之一(事实上唯一的原因)是你想设置一个不同的隔离级别,例如:

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

SELECT * FROM HumanResources.EmployeePayHistory;

SELECT * FROM HumanResources.Department;

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

但是对于单个SELECT语句,我不太确定,除非你有理由采用其他方式并在响应时间/最大化并发性比准确或有效数据更重要的情况下设置READ UNCOMMITTED.

<speculation certainty ="75%">如果单个SELECT语句在显式事务中而不改变隔离级别,我很确定它根本不起作用.单个语句本身就是自动提交或在出错时回滚的事务.</猜测>