【发布时间】:2019-11-08 16:22:29
【问题描述】:
当我们在 C# 中为每个语句打开关闭连接时,如何在单个事务中处理连接?
场景是使用相同的连接字符串,连接打开和关闭多种类型,每个语句一次。
考虑以下示例
void updateSomething() {
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// Execute the statements
connection.Close();
}
}
当我执行以下代码时:
void SomeMethod()
{
using(TransactionScope scope = new TransactionScope())
{
for(int i=0; i < 10; i++)
{
this.updateSomething();
}
scope.Complete();
}
}
建议对每个语句使用连接打开/关闭。那是因为我们实际上并没有创建连接,我们只是使用池中的一个。
为什么会这样?我知道我们保持连接的时间越短越好,但问题是在大多数交易中,我们将在下一个语句的下一刻得到它。
是否只是为了避免在语句之间存在要求的代码计算时间(如果存在)(它不应该这样做,因为它会将数据库锁定在事务状态所需的时间更长)。
在事务期间保持一个连接打开是否有意义?
【问题讨论】:
-
“建议对每个语句使用打开/关闭连接” - 你从哪里读到的? (我没有怀疑,我只是好奇)
-
剧透:一个连接实际上是在事务期间保持打开状态,因为事务实际上不能跨越连接(除非您涉及分布式事务协调器)。
SqlConnection会透明地为您处理这件事,如果您重用完全相同的连接字符串,它会识别这种情况。对您的好处与在运行中打开连接时始终获得的好处相同:编写内部代码更容易,而无需了解事务或如何从错误中恢复。 -
不正确。在事务支持下检查docs.microsoft.com/en-us/dotnet/framework/data/adonet/…。我的问题是 enlist 操作是否太耗时。
标签: c# transactions