Mor*_*gil 4 .net sql-server connection-string sqlconnection distributed-transactions
我有一个分布式事务上下文使用ServiceDomain.在其中,我打开一个带有连接字符串指定的SQL连接Enlist=false,这样它就不会自动登记在事务中.然后,如果我在分布式事务中手动登记连接EnlistDistributedTransaction,则连接不会关闭,这可以以以下结尾InvalidOperationException:
超时已过期.从池中获取连接之前经过的超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小.
请尝试以下方法:
try
{
var configuration = new ServiceConfig
{
Transaction = TransactionOption.Required,
TransactionTimeout = 1000
};
ServiceDomain.Enter(configuration);
for (var i = 0; i < 500; ++i)
{
Console.WriteLine(i);
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=dotest;Integrated Security=SSPI;Enlist=False;"))
{
conn.Open();
if (i % 2 == 0) conn.EnlistDistributedTransaction((ITransaction) ContextUtil.Transaction);
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO [Test]([ID]) VALUES(@num)";
cmd.Parameters.AddWithValue("@num", i);
cmd.ExecuteNonQuery();
}
}
}
ContextUtil.SetAbort();
}
finally
{
ServiceDomain.Leave();
}
Run Code Online (Sandbox Code Playgroud)
这会在200个连接处卡住(并在超时后死亡),因为所有100个登记的连接显然都没有关闭(并且默认连接池大小为100).(请注意,如果要在不创建表的情况下进行测试,则可以完全删除该命令.)
我错过了什么或做错了什么?
尝试conn.EnlistDistributedTransaction(null);在查询执行结束时进行设置.
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=dotest;Integrated Security=SSPI;Enlist=False;"))
{
conn.Open();
if (i % 2 == 0) conn.EnlistDistributedTransaction((ITransaction) ContextUtil.Transaction);
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO [Test]([ID]) VALUES(@num)";
cmd.Parameters.AddWithValue("@num", i);
cmd.ExecuteNonQuery();
}
conn.EnlistDistributedTransaction(null);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10082 次 |
| 最近记录: |