SQL Server事务和SELECT语句

时间:2012-03-22 08:07:29

标签: sql-server

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

我得到了一个答案,即事务中的SELECT可以看到该事务中其他先前Insert/Update/Delete语句所做的更改,事务外的SELECT语句不能。< / p>

以上陈述是否属实?

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

2 个答案:

答案 0 :(得分:18)

尝试这样做,你会理解:

在SSMS上打开两个新查询(从现在开始称之为A和B),然后在A上创建一个这样的简单表:

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

现在,执行以下操作:

在他们两个中做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,您将看到查询已完成

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

答案 1 :(得分:5)

我能想到的主要原因之一(事实上唯一的原因)是你想要设置不同的isolation level,例如:

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

SELECT * FROM HumanResources.EmployeePayHistory;

SELECT * FROM HumanResources.Department;

COMMIT TRANSACTION;

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

&lt; speculation certainty =“75%”&gt; 如果单个SELECT语句在显式事务中而不改变隔离级别,我很确定根本没有效果。单个语句本身就是自动提交或在出错时回滚的事务。&lt; / speculation&gt;