【问题标题】:Sql Connection Isolation Level retentionSql 连接隔离级别保留
【发布时间】:2013-06-13 04:46:49
【问题描述】:

我有一个包含两部分的小型应用程序:

  1. 与数据库联系以检索配置数据的配置部分。
  2. 使用配置将数据导入数据库的数据导入器部分。

数据导入器正在使用IsolationLevel.Snapshot 上的事务在多个线程中运行

配置sql命令不使用任何事务。

数据导入器不能在配置窗口打开的同时运行。

我的问题如下:

1.打开应用程序并检查配置。 (进入配置窗口抽查一切)。 2.运行数据导入。 3.重新打开配置窗口。

在导入后重新打开配置窗口时,我将收到来自 DataReader 的错误消息,指出 Snapshot isolation transaction failed accessing database... 但是此 DataReader 是从根本没有设置任何事务或 IsolationLevel 的 SqlConnection 创建的。

如果我重新启动应用程序,我可以重新打开配置窗口而不会出错。

.Net 或 SQLServer 是否持有 IsolationLevel ?

有没有办法在 IsolationLevel 设置后更改它而不为所有内容创建新事务?

【问题讨论】:

  • "配置sql命令不使用任何事务。" - 这是不正确的。每个 DML 语句都在事务中运行,无论是否打开了一个。如果在运行语句时没有打开一个,SQL Server 将打开一个。在您的语句完成后,它对该事务的作用取决于您的连接处于哪种模式 - 将是自动提交或隐式事务模式。
  • 我现在明白这一点了,最初我只是使用 Visual Studio 的调试监视并手动查看所有“事务”属性,发现它们都为空,这导致我得出这样的结论。

标签: c# sql-server isolation-level transaction-isolation


【解决方案1】:

我认为隔离级别是通过连接池进行的。

这是设计使然,正如kb article 所述。

有一些方法可以解决这个问题,例如明确指定事务隔离级别。

您可能想查看this article

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多