Я смущен. На первый взгляд, выполнение транзакции на 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 не использует это свойство. Итак, что это такое ?
Так что мои вопросы:
- мне нужно установить свойство Transaction моего OracleCommand и если да, то что именно делает это делать?
- Если я начал транзакцию по соединению, ВСЕ последующие команды , выполненные в этом соединении (до фиксации или откат) этой транзакции, даже если я не устанавливаю свойство Transaction в этих командах?
Документация оракула ужасна. Я только что посмотрел на тот же самый пример, и не очевидно, как транзакция и команда действительно связаны друг с другом - они, похоже, работают через эфир, что довольно беспокоит. Я думаю, что решение состоит в том, чтобы разобраться в нем один раз, а затем обернуть API, чтобы скрыть все сумасшедшие! –