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

本文关键字:执行 Oracle 事务 NET ODP 使用 | 更新日期: 2023-09-27 18:32:11

>我很困惑。从表面上看,用 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. 如果我在连接上启动了事务,则所有后续在该事务的连接部分(直到提交或回滚)上执行的命令,即使我没有设置事务这些命令的属性?

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

1) 我是否需要设置我的 OracleCommand 的事务属性,

不。

如果是这样,这到底是做什么的?

这是无操作。

OracleCommand会自动"重用"当前在命令OracleConnection上处于活动状态的事务。Transaction属性之所以存在,仅仅是因为它是在基类(DbCommand)中声明的,并且您不能"取消声明"继承类中的成员。如果你阅读它,你会得到连接的事务(如果有的话),设置它什么也不做。

2) 如果我在连接上启动了事务,那么在该连接上执行的所有后续命令(直到提交或回滚)是否都是该事务的一部分,即使我没有在这些命令上设置 Transaction 属性?

完全。