Sql 订单标题-订单行事务的正确隔离级别是什么?
假设我们有一个Order_Header和Order_LineItems表的常见情况。 另外,假设我们有用于创建、更新和选择订单的事务。比如: 创建:Sql 订单标题-订单行事务的正确隔离级别是什么?,sql,sql-server,transaction-isolation,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 dep
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
有人能说说每个事务的正确隔离级别是什么,并简要解释原因吗
[更新]
WHERE OrderDate > '1-1-2017'
作为事务开始时的值。首先确保数据库已启用快照隔离
ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
第一个事务需要快照隔离
ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
第二个事务需要读提交隔离
ALTER DATABASE YOURDB
SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
你想防范什么?是否要确保在提交之前,其他数据库会话不能为
@Id
插入订单行项目?你想阻止其他人在你提交之前插入与WHERE OrderDate>'1-1-2017'
匹配的行吗?再加上@BenGribaudo,问题,你想让WHERE OrderDate>'1-1-2017'
的结果在交易开始时或选择查询运行时具有价值吗?大家好,谢谢大家提出的好问题!我已经更新了我的问题。@deezg,我不确定我是否理解如果可以确保读取的值在事务开始时,为什么要阻止并发会话插入。通过行版本控制而不是锁定(即快照而不是可序列化)可以达到所需的隔离级别。@Dan well,这是一个好问题。我不认为这是相关的。实际上,我想要最简单的方法来确保我不会因为错误的结果而与订单发生冲突。您是对的,如果从事务开始就确保值为1,那么就没有必要阻止并发更新。你会如何处理这种情况?你喜欢什么样的解决方案?