gpt4 book ai didi

.net - SQL Server 和 TransactionScope(带 MSDTC): Sporadically can't get connection

转载 作者:行者123 更新时间:2023-11-28 20:09:59 27 4
gpt4 key购买 nike

我已经为调用 SQL Server 的 .net 代码编写了一些测试。看来使用 System.Transactions 是回滚对数据库所做的任何修改的绝佳选择。我知道一些纯粹主义者会建议我可能想要模拟数据库,但我不会走那条路;这不是严格意义上的纯单元测试。

当我编写并运行多个测试时,这完全符合预期。我只是将初始化和中止 .net 事务的代码放在测试设置和测试拆卸方法中。这似乎是一个很好的解决方案。

但是,我遇到的问题是,当我尝试运行 100 个这样的测试时,其中许多会抛出无法连接到 SQL Server 的异常,即使它们在一个接一个地运行时通过了。更糟糕的是,当我运行测试时,我的数据库中的表有时会偶尔被锁定。我必须让我的 DBA 手动移除锁。

正如你们中的许多人所知,对在开发工作站上运行的代码(如运行此测试)针对 SQL 服务器使用 TransactionScope 将使 .net 框架使用 MSDTC。

这里有一个代码示例来说明我在做什么:

 <TestInitialize()> Public Sub MyTestInitialize()
_scope = New System.Transactions.TransactionScope( _
System.Transactions.TransactionScopeOption.Required, New TimeSpan(0, 2, 0))
End Sub
<TestCleanup()> Public Sub MyTestCleanup()
_scope.Dispose()
End Sub

<TestMethod()> Public Sub CurrentProgramUser_Get_UserID()
Dim ProgramSessionId As String
Dim CurrentProgramUserId As Integer
Dim dSession As ProgramSession
CurrentDCMAUserId = Convert.ToInt32( _
SqlHelper.ExecuteScalar(testDcmaConnString, System.Data.CommandType.Text, _
"INSERT into Program_Users(UserName,FirstName,LastName) " & _
"VALUES('GuitarPlayer','Bob','Marley')" & _
"SELECT IDENT_CURRENT('Program_users') ") _
)
ProgramSessionId = session.getCurrentSession()
session.WriteUserParam("Program", ProgramSessionId, "USERID", CurrentProgramUserId.ToString(), testSource, testConnString)

Dim readValue As Integer
readValue = session.User.UserID

Assert.AreEqual(CurrentProgramUserId, readValue)
End Sub

如您所见,这里没有什么特别花哨的地方。我只有一个测试方法,它将向我的数据库写入一些我希望我的方法找到的东西。这只是一个例子;还有许多其他类似的测试。

我的测试逻辑似乎是合理的。是什么导致我的测试不仅失败,而且偶尔将用户锁定在表之外?

最佳答案

我发现了问题。我正在测试的方法之一使用 SqlDataReader 对象。显然,必须在 SqlDataReader 超出范围之前调用 Close() 方法才能释放连接,但在我的例子中,我没有这样做。

只需将 mySqlDataReader.Close() 添加到被测方法的末尾即可解决问题。此外,测试此特定方法的测试方法是数据驱动的,有 100 多个测试用例,因此这解释了我为什么会用完连接。

关于.net - SQL Server 和 TransactionScope(带 MSDTC): Sporadically can't get connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3072986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com