这个.NET / SQL Server事务方案是否可行?

时间:2012-10-04 21:36:48

标签: sql-server vb.net transactions transactionscope

我刚刚意识到我从根本上不了解.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秒的时间块)在交易的上下文表中??

3 个答案:

答案 0 :(得分:1)

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

启用快照隔离并在其他阅读过程中使用IsolationLevel.Snapshot。在您进行任何修改之前,他们会在州内看到该表。他们不会阻止(等待)。

答案 1 :(得分:1)

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问题讨论。

答案 2 :(得分:0)

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

希望有所帮助。