2012-03-22 101 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語句是一個明確的事務中不改變隔離級別,我敢肯定,不會有任何效果可言。單獨的語句本身就是自動提交或錯誤回滾的事務。 < /投機>