Order header - Order lines 事务的正确隔离级别是多少?

What is the correct isolation level for Order header - Order lines transactions?

假设我们有 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. 我想确保没有其他 session 可以插入匹配的行 WHERE OrderDate > '1-1-2017'

  2. 我还想确保第二个事务(纯选择订单)永远不会在第一个事务中选取未完全 'done' 的行。表示那些在事务插入部分中创建但尚未在更新部分中更新的那些。 (我想这是默认的 READ COMMITED 涵盖的,对吧?)

[更新 2]

我要

WHERE OrderDate > '1-1-2017'

为交易开始时的值。

首先确保你的数据库启用了快照隔离

ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON

第一笔交易需要 SNAPSHOT 隔离

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

第二个事务需要 READ COMMITTED 隔离

 SET TRANSACTION ISOLATION LEVEL READ COMMITTED