【问题标题】:Performing an Oracle Transaction using C# and ODP.NET使用 C# 和 ODP.NET 执行 Oracle 事务
【发布时间】:2013-09-26 16:24:00
【问题描述】:

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

【问题讨论】:

  • oracle 文档很糟糕。我一直在看完全相同的例子,但事务和命令实际上是如何相互关联的并不明显——它们似乎是通过以太工作的,这非常令人担忧。我认为解决的办法是先搞清楚,然后封装API来隐藏所有的疯狂!

标签: c# transactions oracle11g oraclecommand


【解决方案1】:

1) 我需要设置我的 OracleCommand 的 Transaction 属性吗,

没有。

如果是这样,这究竟是做什么的?

这是一个无操作。

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

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

没错。

【讨论】:

  • 优秀。谢谢。我不明白如果它什么都不做,为什么该属性会在那里!谢谢解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多