TransactionScope和连接池

Gra*_*ham 9 sql-server connection-pooling transactionscope isolation-level .net-3.5

我正在尝试使用不正确的IsolationLevels来处理我们的应用程序中是否存在数据库连接问题.我们的应用程序是使用SQL Server 2005的.Net 3.5数据库应用程序.

我发现连接的IsolationLevel在返回到连接池时没有被重置(参见这里),并且在这篇博文中读到每个新创建的TransactionScope都有自己的连接池分配给它时也很惊讶.

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

提前致谢,

格雷厄姆

Mit*_*eat 7

这令人担忧!

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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