gpt4 book ai didi

sql-server - TransactionScope 和连接池

转载 作者:行者123 更新时间:2023-12-02 11:21:03 25 4
gpt4 key购买 nike

我正在尝试了解我们的应用程序中是否存在使用不正确的隔离级别进行数据库连接的问题。我们的应用程序是一个使用 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/

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