Order header的正确隔离级别是什么 - 订单行交易?

时间:2017-07-03 20:11:42

标签: sql sql-server transaction-isolation

假设我们在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

有人可以说出每个交易的正确隔离级别,并简要解释原因吗?

[UPDATE]

  1. 我想确保没有其他会话可以插入匹配的行 WHERE OrderDate> '2017年1月1日'

  2. 我还想确保第二个事务(纯选择订单)永远不会拾取在第一个事务中未完全“完成”的行。这意味着在事务INSERT部分中创建但在UPDATE部分中尚未更新的部分。 (我猜这是默认的READ COMMITED,对吗?)

  3. [更新2]

    我想要

    WHERE OrderDate > '1-1-2017'
    

    是交易开始时的价值。

1 个答案:

答案 0 :(得分:1)

首先确保您的数据库已启用快照隔离

ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON

首次交易需要SNAPSHOT隔离

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

第二次交易需要READ COMMITTED隔离

 SET TRANSACTION ISOLATION LEVEL READ COMMITTED