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
有人可以说出每个事务的正确隔离级别是多少并简要解释原因吗?
[更新]
我想确保没有其他 session 可以插入匹配的行
WHERE OrderDate > '1-1-2017'
我还想确保第二个事务(纯选择订单)永远不会在第一个事务中选取未完全 '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
假设我们有 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
有人可以说出每个事务的正确隔离级别是多少并简要解释原因吗?
[更新]
我想确保没有其他 session 可以插入匹配的行 WHERE OrderDate > '1-1-2017'
我还想确保第二个事务(纯选择订单)永远不会在第一个事务中选取未完全 '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