我经常看到许多人在事务中使用SELECT
语句。我经常只在交易中使用insert/update/delete
。我只是不明白,在交易中使用SELECT
声明有什么用处。SQL Server事务和SELECT语句
我得到一个答案是.... SELECT
交易可看到其他以前Insert/Update/Delete
语句在事务中进行,该事务外的SELECT
声明不能改变里面。
上面的陈述是真的吗?
这是人们把SELECT
声明放入交易的唯一原因吗?如有可能,请详细讨论所有原因。感谢
我经常看到许多人在事务中使用SELECT
语句。我经常只在交易中使用insert/update/delete
。我只是不明白,在交易中使用SELECT
声明有什么用处。SQL Server事务和SELECT语句
我得到一个答案是.... SELECT
交易可看到其他以前Insert/Update/Delete
语句在事务中进行,该事务外的SELECT
声明不能改变里面。
上面的陈述是真的吗?
这是人们把SELECT
声明放入交易的唯一原因吗?如有可能,请详细讨论所有原因。感谢
尝试这样做,你会明白:
公开赛上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
上的一个 你会看到,查询不会被锁定交易
一个我能想到的原因主要(唯一的理由,其实)是,如果你想设置一个不同的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语句是一个明确的事务中不改变隔离级别,我敢肯定,不会有任何效果可言。单独的语句本身就是自动提交或错误回滚的事务。 < /投机>
如果您使用默认隔离级别('READ COMMITTED') - 那么是 - 事务外的'SELECT'将不会**查看任何插入或更新事务,直到它们实际上承诺。 – 2012-03-22 09:04:11