【问题标题】:SQL Connection Won't Run During TransactionSQL 连接不会在事务期间运行
【发布时间】:2015-03-06 16:28:12
【问题描述】:

我有 2 个场景都运行相同的代码,其中一个 100% 的时间运行,而另一个则同样经常失败。

当事务正在进行时,我有 2 个 sql 连接在本地指向同一个 sql 服务器。当我尝试对第二个连接运行查询时,它会超时。在调试时,我什至可以进入 SSMS 并尝试运行查询,它也会坐在那里。它在其他情况下工作的事实很奇怪,但最终我试图弄清楚为什么当我运行其他 sqlconnection 时 sql 被锁定。

是否有人对可能导致此问题的原因或我可以使用的任何调试工具有任何想法?我对使用 transactionScope 不感兴趣。

如果我事先关闭第一个连接,第二个连接的查询将运行良好。

这是问题发生的时间。此时,我们有一个附加并正在运行的事务的 sqlconnection1:

                    SqlConnection connection = new SqlConnection(ConnectionString);
                    connection.Open();

                    SqlCommand command = new SqlCommand("", connection);


                    command.CommandText = "a read command"
                    int  count = command.ExecuteScalar();

【问题讨论】:

  • 能否将连接附加到与 sqlConnection1 相同的事务?如果您使用事务范围,那应该相当容易,但如果您的 sql 提供程序不允许这样做..
  • 不,很遗憾,我无法将事务与多个连接相关联。我知道范围是这样做的,这就是为什么我在意识到它需要该服务之前尝试使用它的原因。如果这是一个个人项目,我会这样做,但我现在要求这项服务是不可行的。
  • 那么为什么要使用两个连接呢?
  • 仅仅是因为我可能正在查询不同的数据库。在这种情况下,它最终是相同的。也许这就是需要发生的事情。我可以检查它是否相同并使用相同的连接。当它们在不同的数据库上时,我会看看是否存在问题。
  • 如果它们是不同的数据库,则不应有任何锁定。您需要担心是否可能有不同的进程/线程使用该代码查询同一个数据库,即使您只使用一个连接。

标签: c# sql .net transactions sqlconnection


【解决方案1】:

如前所述,第一件事是,如果您不需要两个连接,您可以只使用一个,这样所有的东西都在同一个事务中运行。

如果您需要这组 SQL 与运行类似查询的其他进程或线程并行运行,您可能需要重新审视语句的隔离和锁定。

您可能正在将第一个事务作为可序列化隔离运行并对其进行更新。考虑使用 ReadCommited(或 Snapshot ReadCommited)。但这取决于你的实际工作。

从 SSMS,尝试先运行

SET TRANSACTION ISOLATION LEVEL READUNCOMMITTED

这应该避免第一个事务创建的锁,但这只是为了让您了解它发生的原因,使用该隔离级别不是一个好主意!

【讨论】:

  • 这让我可以在 SSMS 中运行查询。我对此不熟悉,所以让我做一些研究,如果它解决了我的问题,我会告诉你。谢谢你的信息!
  • 更改隔离级别最简单的方法是创建一个事务范围,不知道为什么要避免它。
  • 看起来我仍然可以设置基本 SqlTransaction 的 IsolationLevel。我正在避开范围,因为我没有运行它需要的 Sql 服务(这个名字现在让我忘记了)。
  • 我为事务设置了隔离级别,确认在故障点它仍然正确设置了属性,并且仍然锁定。它也仍然锁定在 SSMS 中,但在 SSMS 中明确设置它将允许我从那里查询。编辑:顺便说一下,我将隔离级别设置为 ReadUncommitted。
  • 当然,它只是 1 个事务,但是 2 个 sql 连接。该事务附加到执行读/写操作的 sqlconnection1。在中途,我初始化了 sqlconnection2,它从不同的数据库中读取。
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2023-04-05
  • 2020-09-17
  • 1970-01-01
相关资源
最近更新 更多