Выполнение транзакции Oracle с использованием C# и ODP.NET

Я в замешательстве. На первый взгляд, выполнение транзакции в 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

advocate установка свойства транзакции самого объекта OracleCommand. например,

cmd.Transaction = txn;

другие источники говорят, что это свойство доступно только для чтения. Это на самом деле не читал только, но нигде четко не сказано, что он делает.

моя путаница, следовательно, заключается в том, что существование транзакции свойство объекта OracleCommand, по-видимому, предполагает, что оно должно быть используется для выполнения этой команды как части транзакции, и все же Собственная документация Oracle не использует это свойство. Так что это для?

Итак, мои вопросы:

  1. мне нужно установить свойство транзакции моего OracleCommand, и если да, то что именно это делает?
  2. если я начал транзакцию по соединению, все последующие команды, выполняемые для этого соединения (до фиксации или отката) части этой транзакции, даже если я этого не делаю набор проводки собственность на эти команды?

1 ответов


1) мне нужно установить свойство транзакции моего OracleCommand,

нет.

и если да, то что именно это делает?

это нет.

на OracleCommand автоматически "повторно использует" транзакцию, которая в настоящее время активна в команде OracleConnection. The Transaction свойство существует просто потому, что оно было объявлено в базовом классе (DbCommand) и вы не можете "undeclare" член в унаследованном классе. Если Вы читаете его, вы получите транзакцию соединения (если она есть), установив, что она ничего не делает.

2) Если я начал транзакцию в соединении, выполняются ли все последующие команды в этом соединении (до фиксации или отката) частью этой транзакции, даже если я не устанавливаю свойство транзакции в этих командах?

точно.