【问题标题】:Is this .NET/SQL Server transaction scenario possible?这种 .NET/SQL Server 事务场景是否可行?
【发布时间】:2012-10-04 21:36:48
【问题描述】:

我刚刚意识到我根本不了解 .NET/SQL Server 事务的工作原理。我觉得我可能会把信封推到“没有愚蠢的问题”,但我读过的所有文档都不容易理解。我将尝试用这样的方式来表达这个问题,答案几乎是是/否。

如果我在一台机器上运行的 .NET 进程有效地执行此操作(不是真正的代码):

For i as Integer = 0 to 100
    Using TransactionScope
        Using SqlClient.SqlConnection
            'Executed using SqlClient.SqlCommand'
            "DELETE from TABLE_A"
            Thread.Sleep(5000)
            "INSERT INTO TABLE_A (Col1) VALUES ('A')"
            TransactionScope.Complete()
        End Using
    End Using
Next i

是否有任何事务/隔离级别配置会使“SELECT count(*) FROM TABLE_A”在从其他进程运行时始终返回“1”(即,即使没有行时有 5 秒的时间块在事务上下文的表中)?

【问题讨论】:

    标签: sql-server vb.net transactions transactionscope


    【解决方案1】:

    是的,您可以让其他进程看不到您在所示事务中所做的更改。为此,您需要更改其他进程,而不是进行修改的进程。

    开启快照隔离并在其他读取进程上使用IsolationLevel.Snapshot。他们将在您进行任何修改之前看到该表的状态。他们不会阻止(等待)。

    【讨论】:

    • 所有有用的答案——了解我需要更改其他流程是我遗漏的关键部分。谢谢。
    【解决方案2】:

    SNAPSHOT isolation 是您正在寻找的。假设当您开始循环时表有一行,在 SNAPSHOT 隔离级别下运行的并发 SELECT 将总是看到 1 行,无论何时运行,无需等待 .

    除 READ UNCOMMITTED 之外的所有其他隔离级别也将始终恰好看到 1 行,但通常会阻塞长达 5 秒。请注意,我将 READ_COMMITTED_SNAPSHOT 视为此参数的 SNAPSHOT。

    脏读,即。在 READ UNCOMMITTED 隔离级别下运行的 SELECT 将有 0、1 甚至 2 行。没错,脏读可能会看到 2 行,即使您从未一次插入 2 行,这是因为 SELECT 的扫描点和事务的插入点之间的竞争条件,请参阅Previously committed rows might be missed if NOLOCK hint is used 以获取类似的问题讨论.

    【讨论】:

      【解决方案3】:

      我相信默认事务超时为 1 分钟(请参阅:http://msdn.microsoft.com/en-us/library/ms172070.aspx),因此在您的事务上下文中,我认为您期望表在插入之前没有记录是正确的(无论暂停如何),因为每个命令将在事务中按顺序完成,这将是删除的结果。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多