2012-03-22 59 views
16

我经常看到许多人在事务中使用SELECT语句。我经常只在交易中使用insert/update/delete。我只是不明白,在交易中使用SELECT声明有什么用处。SQL Server事务和SELECT语句

我得到一个答案是.... SELECT交易可看到其他以前Insert/Update/Delete语句在事务中进行,该事务外的SELECT声明不能改变里面。

上面的陈述是真的吗?

这是人们把SELECT声明放入交易的唯一原因吗?如有可能,请详细讨论所有原因。感谢

+1

如果您使用默认隔离级别('READ COMMITTED') - 那么是 - 事务外的'SELECT'将不会**查看任何插入或更新事务,直到它们实际上承诺。 – 2012-03-22 09:04:11

回答

16

尝试这样做,你会明白:

公开赛上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,你会看到,查询完成

重复测试与 set transaction isolation level read uncommitted上的一个 你会看到,查询不会被锁定交易

+0

感谢您的回答。你可以告诉我什么是“隔离级别读取承诺”?这是什么意思“隔离级别读提交”根据你的解释它将是表锁,但我想锁只行。所以引导我。谢谢 – Thomas 2013-11-06 09:04:18

+0

每个事务都有一个隔离级别。读取已提交是默认设置,这意味着您只能读取已保存到磁盘的数据。 您可能想要了解一些关于隔离级别的信息,这里有很多材料,并且很难总结 – Diego 2013-11-06 09:29:47

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。

<投机确定性=“75%” >如果单一SELECT语句是一个明确的事务中不改变隔离级别,我敢肯定,不会有任何效果可言。单独的语句本身就是自动提交或错误回滚的事务。 < /投机>