c# - 使用 C# 和 ODP.NET 执行 Oracle 事务

标签 c# transactions oracle11g oraclecommand

我很困惑。从表面上看,在 C# 中执行事务似乎 简单的。从这里开始:

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm

string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();

OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT COUNT(*) FROM MyTable";

// Start a transaction
OracleTransaction txn = con.BeginTransaction(
  IsolationLevel.ReadCommitted);

try
{
  // Insert the same row twice into MyTable
  cmd.CommandText = "INSERT INTO MyTable VALUES (1)";
  cmd.ExecuteNonQuery();
  cmd.ExecuteNonQuery(); // This may throw an exception
  txn.Commit();
}....

因此,创建一个连接,在该连接上开始一个事务,然后继续,直到您想要提交或回滚。

但是,其他来源,比如这里:

https://forums.oracle.com/thread/319121

提倡设置 OracleCommand 对象本身的 Transaction 属性。例如

cmd.Transaction = txn;

但其他消息来源称此属性是只读的。它实际上并没有被阅读 只是,但似乎没有任何地方清楚地说明它的作用。

因此,我的困惑是交易的存在 OracleCommand 对象上的属性似乎表明它应该 用于执行该命令作为事务的一部分,但 Oracle 自己的文档不使用此属性。那是什么 为了?

所以我的问题是:

  1. 我是否需要设置我的 OracleCommand 的事务属性,以及 如果是这样,这到底是做什么的?
  2. 如果我已经在一个连接上开始了一个事务,那么所有的事务都是后续的 在该事务的该连接上执行的命令(直到提交或回滚),即使我没有设置事务 这些命令的属性?

最佳答案

1) do I need to set the Transaction property of my OracleCommand,

没有。

and if so, what exactly does this do?

这是一个空操作。

OracleCommand 自动“重用”命令的 OracleConnection 当前处于事件状态的事务。 Transaction 属性存在只是因为它是在基类 (DbCommand) 中声明的,您不能“取消声明”继承类中的成员。如果您阅读它,您将获得连接的事务(如果有),设置它什么都不做。

2) If I've started a transaction on a connection, are ALL subsequent commands performed on that connection (until a commit or rollback) part of that transaction, even if I don't set the Transaction property on those commands?

没错。

关于c# - 使用 C# 和 ODP.NET 执行 Oracle 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18931026/

相关文章:

c# - 为什么 DateTime 基于 Ticks 而不是毫秒?

c# - 如何在 Postback 上获取我的隐藏字段值

java - 读提交和幻读(Spring)

hibernate - Spring + Hibernate +JTA - HibernateTransactionManager 或 JTATransactionManager

java - 关于使用 Hibernate 将对象映射到数据库

oracle - 如何将 Oracle PL/SQL 包中的电子邮件发送给多个收件人?

java - 如何打印出将发送到 oracle 的 sql 查询

c# - 用户界面缩放/设置

java - Java 中的 MySQL 事务

c# - 动态更改色带标签