sql-server - TransactionScope 和连接池

标签 sql-server .net-3.5 connection-pooling transactionscope isolation-level

我正在尝试了解我们的应用程序中是否存在使用不正确的隔离级别进行数据库连接的问题。我们的应用程序是一个使用 SQL Server 2005 的 .Net 3.5 数据库应用程序。

我发现连接的 IsolationLevel 在返回到连接池时不会重置(请参阅 here ),并且在读到此 blog post 时也感到非常惊讶创建的每个新 TransactionScope 都会分配给它自己的连接池。

我们的数据库更新(通过我们的业务对象)发生在 TransactionScope 内(为每个业务对象图更新创建一个新的)。但我们的提取不使用显式事务。所以我想知道的是,我们是否会遇到这样的情况:我们的获取操作(应该使用默认的 IsolationLevel - 已提交读)将重用池中已用于更新的连接,并继承更新 IsolationLevel (可重复读取)?或者我们的更新是否可以保证使用不同的连接池,因为它们被包装在 TransactionScope 中?

提前致谢,

格雷厄姆

最佳答案

这令人担忧!

您链接到的 Bill Vaughan 的文章指出“...每个 TransactionScope 都有自己的池”,但您链接到的支持文章中的代码表明情况并非如此,因为第二次运行 NoTxScope( ) 从使用提升隔离级别的池中获取连接。

您可以通过[我正在利用第一个链接中的代码]来“强制”解决问题:

static void ForceReadCommitedScope()
{
    TransactionOptions op = new TransactionOptions();
    op.IsolationLevel = IsolationLevel.ReadCommitted;
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew, op))
    {
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True;");
        SqlCommand com = new SqlCommand("select transaction_isolation_level from sys.dm_exec_sessions where (session_id = @@SPID)", con);
        con.Open();
        short level = (short)com.ExecuteScalar();
        Console.WriteLine("transaction_isolation_level : " + level.ToString());
        con.Close();
        tx.Complete();
    }
}

或者通过将 "..;Pooling=False" 添加到您的连接字符串中。

关于sql-server - TransactionScope 和连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2425550/

相关文章:

.net - 如何在 WPF 中的控件顶部显示进度条

java - Oracle UCP - FCF 计划中断支持

sql - 如何更新 SQL 中相同的数据行?

sql-server - 替换 MS SQL Server 中的特定 Unicode 字符

c# - LINQ:将 DataTable 转换为包含数组的用户定义类

c# - 从代理后面的应用程序连接 WCF 服务 - 测试模拟

javascript - SQL/C# DateTime 转换为 Javascript 变量

sql - 如果存在,则选择其他插入然后选择

jakarta-ee - Caused by : com. ibm.websphere.ce.j2c.ConnectionWaitTimeoutException : Connection not available, 等待180008超时

datasource - Quartz 调度程序不会在 AWS RDS 故障转移上更新数据库连接