且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-12-01 16:48:38

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

否.

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

这是无人操作.

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

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

完全正确.

I'm confused. On the face of it, performing a transaction in C# seems simple. From here:

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();
}....

So, create a connection, begin a transaction on that connection, and then off you go until you want to commit or rollback.

However, other sources, such as here:

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

advocate setting the Transaction property of the OracleCommand object itself. e.g.

cmd.Transaction = txn;

Yet other sources say that this property is read only. It's not actually read only, but nowhere appears to clearly say what it does.

My confusion, therefore, is that the existence of the Transaction property on the OracleCommand object seems to suggest that it should be used to perform that command as part of a transaction, and yet Oracle's own documentation does not use this property. So what is it for?

So my questions are:

  1. do I need to set the Transaction property of my OracleCommand, and if so, what exactly does this do?
  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?

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

No.

and if so, what exactly does this do?

It's a no-op.

The OracleCommand automatically "reuses" the transaction that is currently active on the command's OracleConnection. The Transaction property is there simply because it was declared in the base class (DbCommand) and you cannot "undeclare" a member in the inherited class. If you read it you'll get the connection's transaction (if any), setting it does nothing.

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?

Exactly.