我经常看到很多人在交易中使用SELECT
语句。我经常只在交易中使用insert/update/delete
。我只是不明白在事务中放置SELECT
语句的效用是什么。
我得到了一个答案,即事务中的SELECT
可以看到该事务中其他先前Insert/Update/Delete
语句所做的更改,事务外的SELECT
语句不能。< / p>
以上陈述是否属实?
这是人们将SELECT
声明置于交易中的唯一原因吗?如果可能,请详细讨论所有原因。感谢
答案 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;