13

よくわかりません。一見すると、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 オブジェクトに Transaction プロパティが存在することは、そのコマンドをトランザクションの一部として実行するために使用する必要があることを示唆しているように見えるのに、Oracle 自身のドキュメントではこのプロパティを使用していないことです。それで、それは何のためですか?

だから私の質問は:

  1. OracleCommand の Transaction プロパティを設定する必要がありますか?もしそうなら、これは正確に何をしますか?
  2. 接続でトランザクションを開始した場合、その接続で (コミットまたはロールバックまで) 実行される後続のすべてのコマンドは、それらのコマンドで Transaction プロパティを設定しなくても、そのトランザクションの一部ですか?
4

1 に答える 1

20

1) OracleCommand の Transaction プロパティを設定する必要がありますか?

いいえ。

もしそうなら、これは正確に何をしますか?

それはノーオペレーションです。

OracleCommand、コマンドの で現在アクティブなトランザクションを自動的に「再利用」しOracleConnectionます。基本クラス ( ) で宣言されており、継承されたクラスのメンバーを "宣言解除" できないという理由だけで、Transactionプロパティが存在します。DbCommandそれを読むと、接続のトランザクション (存在する場合) が取得されます。設定しても何も起こりません。

2) 接続でトランザクションを開始した場合、その接続で (コミットまたはロールバックまで) 実行される後続のすべてのコマンドは、それらのコマンドで Transaction プロパティを設定しなくても、そのトランザクションの一部ですか?

丁度。

于 2013-09-21T10:30:00.837 に答える