我经常看到很多人SELECT在交易中使用陈述.我经常insert/update/delete只在交易中使用.我只是不明白将一个SELECT语句放在事务中的效用是什么.
我得到了一个答案...... SELECT在事务内部可以看到该事务中其他先前Insert/Update/Delete语句所做的更改,事务SELECT外部的语句不能.
以上陈述是真的还是不真实?
这是人们将SELECT声明置于交易中的唯一原因吗?如果可能,请详细讨论所有原因.谢谢
Die*_*ego 19
尝试这样做,你会明白:
在SSMS上打开两个新查询(从现在开始称之为A和B),在A上创建一个如下所示的简单表:
create table transTest(id int)
insert into transTest values(1)
Run Code Online (Sandbox Code Playgroud)
现在,执行以下操作:
做到select * from transTest这两点.您将看到值1
在奔跑:
set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)
在B运行:
begin transaction
insert into transTest values(2)
Run Code Online (Sandbox Code Playgroud)
在奔跑:
select * from transTest
您将看到查询不会完成,因为它被A上的事务锁定
在B运行:
commit transaction
Run Code Online (Sandbox Code Playgroud)
回到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;
Run Code Online (Sandbox Code Playgroud)
但是对于单个SELECT语句,我不太确定,除非你有理由采用其他方式并在响应时间/最大化并发性比准确或有效数据更重要的情况下设置READ UNCOMMITTED.
<speculation certainty ="75%">如果单个SELECT语句在显式事务中而不改变隔离级别,我很确定它根本不起作用.单个语句本身就是自动提交或在出错时回滚的事务.</猜测>
| 归档时间: |
|
| 查看次数: |
19811 次 |
| 最近记录: |