2017-07-03 83 views
0

可以說,我們對Order_Header和Order_LineItems表有一個通常的情況。 另外,可以說我們有創建,更新和選擇訂單的交易。像:訂單標題的訂單行交易的正確隔離級別是什麼?

創建:

BEGIN TRANSACTION 

INSERT INTO Order_Headers... 

SET @Id = SCOPE_IDENTITY() 

INSERT INTO Order_LineItems...(using @Id) 

DECLARE @SomeVar INT 

--just example to show update dependant on select 
SELECT @SomeVar = COUNT(*) Order_Headers 
WHERE OrderDate > '1-1-2017' 

UPDATE Order_Headers 
SET SomeValue = @SomeVar 
WHERE Id = @Id 

COMMIT 

END TRANSACTION 

在另一方面,我們有交易,獲得訂單的基礎上的一些標準,爲簡單起見,可以說,過去的10:

SELECT TOP 10 * FROM Order_Headers 
ORDER BY Id DESC 

可能有人請說什麼是每個交易的正確隔離等級,並且很快解釋爲什麼?

[更新]

  1. 我要確保沒有其他用戶可以插入的行匹配 WHERE訂購日期> '2017年1月1日'

  2. 我也要打確保第二個事務(純粹的選擇訂單)從不選擇在第一個事務中未完全「完成」的行。意思是那些在事務中創建的INSERT部分,但尚未在UPDATE部分中更新。 (我想這是由READ COMMITED覆蓋爲默認,是嗎?)

[UPDATE 2]

我想

WHERE OrderDate > '1-1-2017' 

是在的開始時的值交易。

+0

什麼是你想守護反對?你想確保在你提交之前沒有其他數據庫會話可以爲'@ Id's插入Order_LineItems嗎?你想阻止別人插入匹配'WHERE OrderDate>'1-1-2017''的行直到你提交? –

+0

添加到@BenGribaudo,問題是,當事務開始時或「SELECT」查詢運行時,是否希望'WHERE OrderDate>'1-1-2017''的值爲結果? –

+0

嗨,大家好,謝謝你們倆的好問題!我已更新我的問題。 –

回答

1

首先確保你的數據庫啓用快照隔離

ALTER DATABASE YOURDB 
SET ALLOW_SNAPSHOT_ISOLATION ON 

第一個事務需要快照隔離

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

第二次交易需要提交讀隔離

SET TRANSACTION ISOLATION LEVEL READ COMMITTED