我經常看到許多人在事務中使用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