【问题标题】:Commit some oracle changes in transactionscope immediately?立即在 transactionscope 中提交一些 oracle 更改?
【发布时间】: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


【解决方案1】:

也许这会解决你的问题:

编写一个 Oracle PL/SQL 过程来写入日志。此过程必须具有编译指示“AUTONOMOUS_TRANSACTION”。然后调用这个过程而不是直接插入。

【讨论】:

  • 谢谢!我会尝试,但不是我首选的多次调用 PL/SQL 过程的解决方案。
  • 有时最好在数据库中有一个“原子”功能,您可以从任何您想要的地方调用它。在我的环境中,我有 Java 和 APEX 程序在 Oracle 数据库上工作。为了确保所有人都以相同的方式做事,我经常使用存储过程。最大的好处是,业务逻辑只在一个地方!!!祝你好运!
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多