2013-09-21 3 views
8

Я смущен. На первый взгляд, выполнение транзакции на C# кажется простым. Отсюда:Выполнение транзакции Oracle с использованием C# и ODP.NET

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

защитник устанавливая свойство Transaction самого объекта OracleCommand. например

cmd.Transaction = txn; 

Другие источники утверждают, что это свойство является только для чтения. На самом деле это не читать только , но нигде не видно, что он говорит.

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

Так что мои вопросы:

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

Документация оракула ужасна. Я только что посмотрел на тот же самый пример, и не очевидно, как транзакция и команда действительно связаны друг с другом - они, похоже, работают через эфир, что довольно беспокоит. Я думаю, что решение состоит в том, чтобы разобраться в нем один раз, а затем обернуть API, чтобы скрыть все сумасшедшие! –

ответ

14

1) мне нужно установить свойство Transaction моего OracleCommand,

No.

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

Это не-опера.

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

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

Точно.

+0

Отлично. Благодарю. Я не мог понять, почему собственность будет там, если бы она ничего не сделала! Спасибо за объяснение – bornfromanegg

 Смежные вопросы

  • Нет связанных вопросов^_^