SQLServer事务和SELECT语句

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我经常看到很多人用SELECT语句。我经常用insert/update/delete只在交易中。我只是不明白把SELECT语句内部事务。

我有一个答案就是..。SELECT在事务内部,可以看到其他先前的更改。Insert/Update/Delete在该交易中的语句,aSELECT事务外部的语句不能。

上面的陈述是真的还是假的?

难道这是人们把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

begin transaction
insert into transTest values(2)

select * from transTest

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

commit transaction

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

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

用户回答回答于

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

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

SELECT * FROM HumanResources.EmployeePayHistory;

SELECT * FROM HumanResources.Department;

COMMIT TRANSACTION;

但是,对于单个SELECT语句,我不太确定,除非有理由采取相反的方法,在响应时间/最大化并发比准确或有效的数据更重要的情况下设置ReadUnCOMMIT。

<speculation certainty="75%">如果单个SELECT语句位于一个显式事务中,而不改变隔离级别,我非常肯定这将完全没有影响。单个语句本身就是自动提交或在错误时回滚的事务.</speculation>

扫码关注云+社区