【发布时间】:2015-01-09 12:06:07
【问题描述】:
我有以下代码:
using (TransactionScope tran = new TransactionScope())
{
try
{
OracleConnection _transactionDB = new OracleConnection("ConnectionString");
_transactionDB.Open();
OracleCommand _command = new OracleCommand();
_command.Connection = _transactionDB;
_command.CommandType = CommandType.Text;
_command.CommandText = "INSERT INTO table (id, text) VALUES (3, 'test')";
int rowsAffected = _command.ExecuteNonQuery();
OracleCommand _command2 = new OracleCommand();
_command2.Connection = _transactionDB;
_command2.CommandType = CommandType.Text;
_command2.CommandText = "INSERT INTO log (id, text) VALUES (3, 'Success')";
int rowsAffected2 = _command2.ExecuteNonQuery();
//...some other actions(DB changes)
}
}
是否有解决方案可以立即提交第二次插入,不管事务范围是否失败?此插入应始终在数据库中可见,以便更轻松地查看此事务中发生的情况。
在 oracle 中有一个“AUTONOMOUS_TRANSACTION Pragma”,就像我在 C# 中需要的函数。
谢谢, 迈克尔
【问题讨论】:
-
看起来您使用 Microsoft Data Provider for Oracle。此提供程序已被弃用很长时间。最好使用 Oracle 的 Data Provider,但我不知道这是否支持 TransactionScope。为了安全起见,请分别使用
BeginTransaction()和Commit()方法。Rollback()。当然,您必须使用多个try{} catch {}块重新排列您的 Oracle 命令 -
好点!谢谢,我会看看 Oracle 的数据提供者
-
另一种方法是克隆 Oracle 连接并使用此克隆插入日志条目。这实际上与 Oracle 在自治事务中所做的几乎相同。
-
所以当我克隆一个 oracle 连接时,第二个连接也在 TransactionScope 中,如果事务失败或没有提交?
-
也许“克隆”是错误的表达方式,只需打开与数据库的新连接即可。会话互不干扰,就像打开了两个 SQL*Plus 窗口。
标签: c# oracle transactions transactionscope