C# 完成事务后更改TransactionScope IsolationLevel
在数据库中保存数据时,我使用TransactionScope,并将IsolationLevel设置为SerializableC# 完成事务后更改TransactionScope IsolationLevel,c#,transactions,transactionscope,C#,Transactions,Transactionscope,在数据库中保存数据时,我使用TransactionScope,并将IsolationLevel设置为Serializable TransactionOptions options = new TransactionOptions { IsolationLevel=IsolationLevel.Serializable }; using (var transaction = new TransactionScope(Transaction
TransactionOptions options = new TransactionOptions
{
IsolationLevel=IsolationLevel.Serializable
};
using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
transation.Complete();
}
现在,在执行结束后,我想更改TransactionScopeIsolationLevel
编辑
我的理解是,如果将IsolationLevel设置为Serializable,那么在完成事务后,连接对象将关闭并返回到连接池,当其他请求到达时,它将从池中获取该连接对象,从而受前一个IsolationLevel的影响。因此,我希望在每次事务完成后将隔离级别更改为默认值。你说得对:在将连接返回到池时,不会重置隔离级别。这是一种可怕的行为,但我们仍然坚持下去 有两种策略:
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
这对你有用吗?我被它咬了一口。幸运的是,连接字符串逻辑是集中的。如果Transaction.Current不为null(这意味着我们在TransactionScope中),我所做的就是更改连接字符串的应用程序设置
这样,TransactionScope连接就不会与其他连接共用。感谢您的回复,我准备接受其他更好的选择,但根据您的建议,使用显式事务打开所有连接,您不认为这会给系统带来大量开销吗。我有一个巨大的应用程序,有数百个端点,但我使用TransactionScope的场景只有几个。对于这样的事情,你有什么建议?事务开销几乎没有,因为所有语句都使用隐式事务。;如果您不能迁移所有内容,那么您的方法实际上可能是一个好主意。一个黑客,但一个务实的解决方案。我看不出它有什么大问题;工作有人试过吗?@Hazimdekenl我肯定有