假设我们在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]
我想确保没有其他会话可以插入匹配的行 WHERE OrderDate> '2017年1月1日'
我还想确保第二个事务(纯选择订单)永远不会拾取在第一个事务中未完全“完成”的行。这意味着在事务INSERT部分中创建但在UPDATE部分中尚未更新的部分。 (我猜这是默认的READ COMMITED,对吗?)
[更新2]
我想要
WHERE OrderDate > '1-1-2017'
是交易开始时的价值。
答案 0 :(得分:1)
首先确保您的数据库已启用快照隔离
ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON
首次交易需要SNAPSHOT隔离
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
第二次交易需要READ COMMITTED隔离
SET TRANSACTION ISOLATION LEVEL READ COMMITTED