当我在数据库中保存数据时,我使用TransactionScope并将IsolationLevel设置为Serializable。
TransactionOptions options = new TransactionOptions
{
IsolationLevel=IsolationLevel.Serializable
};
using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
transation.Complete();
}
现在执行结束后,我想更改TransactionScopeIsolationLevel。
修改
我理解的是,如果IsolationLevel设置为Serializable,那么在完成事务之后,连接对象将关闭并返回到连接池,当其他一些请求到达时,它会从池中获取该连接对象,从而受到之前的影响的IsolationLevel。所以我想在每次交易后将隔离级别更改为默认值。
答案 0 :(得分:5)
您说得对:返回池连接时不会重置隔离级别。这是一种可怕的行为,但我们坚持不懈......
有两种策略:
我建议你做后者。
如果您坚持做(1),您只需在关闭TransactionScope
后更改隔离级别,但必须使用连接对象执行此操作。例如:
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
connection.Open(); //open inside of scope so that the conn enlists itself
transation.Complete();
}
//conn is still open but without transaction
conn.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL XXX"); //pseudo-code
} //return to pool
这对你有用吗?
答案 1 :(得分:2)
我一直都喜欢这个。幸运的是,连接字符串逻辑是集中的。如果Transaction.Current不为null(这意味着我们在TransactionScope中),我所做的就是更改连接字符串的应用程序设置。
这样,TransactionScope连接不与其他连接汇集。