Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 订单标题-订单行事务的正确隔离级别是什么?_Sql_Sql Server_Transaction Isolation - Fatal编程技术网

Sql 订单标题-订单行事务的正确隔离级别是什么?

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

假设我们有一个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-1-2017'

  • 我还想确保第二个事务(纯选择订单)永远不会拾取第一个事务中未完全“完成”的行。指在事务插入部分中创建但在更新部分中尚未更新的事务。(我想默认的ReadCommitted包含了这一点,对吗?)

  • [更新2]

    我想要

    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,那么就没有必要阻止并发更新。你会如何处理这种情况?你喜欢什么样的解决方案?