【发布时间】:2011-07-29 09:03:46
【问题描述】:
在使用带有 TransactionScope 的 OracleConnection 时出现这种奇怪的行为。 如果我尝试在事务范围内使用 connection.BeginTransaction() 我会得到简单优雅的 InvalidOperationException :连接已经是本地或分布式事务的一部分。
这里有一些代码:
var trxOptions = new TransactionOptions();
trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (var transaction = new TransactionScope(TransactionScopeOption.Required,trxOptions))
{
var c = ConfigurationManager.ConnectionStrings["oracle_test"].ConnectionString;
using (var oracle = new OracleConnection(c))
{
oracle.Open();
using (var tr = oracle.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
var cmd = oracle.CreateCommand();
cmd.CommandText = "INSERT INTO simple_user VALUES('a')";
cmd.ExecuteNonQuery();
tr.Commit();
}
}
// now go to sql server and insert data
transaction.Complete();
}
如果我不使用 BeginTransaction 一切正常。有什么想法让它发挥作用吗?
PS:我在 Sql Server 上没有这样的问题。
编辑
感谢您的回答,我想我应该添加一些编辑以明确我的问题。
首先,我上面提供的代码是问题的演示。假设我有两个 dll 的 MyProject.Oracle.dll 和 MyProject2.MsSql.dll,我想使用这些 dll 中的方法,它们使用 db.BeginTransaction()。如果这些 dll 使用了 TransactionScope,我的外部事务就不会成为问题。分布式事务将毫无问题地处理。但我无法更改 dll 中的代码。
为什么 db.BeginTransaction() 适用于 SqlServer 而不适用于 Oracle?
【问题讨论】:
标签: c# oracle transactionscope odp.net