Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 13.01.15 17:19
Оценка:
Сделано по типу этого

OracleConnection conn = new OracleConnection ("DSN=consroot;uid=system");
conn.Open();
IDbTransaction trans = conn.BeginTransaction(); 
OracleCommand cmd = (OracleCommand)conn.CreateCommand();
cmd.CommandText = "INSERT INTO ...";
cmd.ExecuteNonQuery();
trans.RollbackTransaction(); 
cmd.Dispose();
conn.Close();

c using и ДБ плугином и Oracle managed access. Но думаю, подробности не принципиальны.
Когда после выполнения теста смотрю ТОАД-ом — строка с INSERT находится в базе. Появляется сразу после ExecuteNonQuery.

Пока только нашел, что если после изменения данных выполнять запрос на создание таблицы, например, то измение данных предварительно коммитится.
Что еще можно проверить?
Re: Оракле 11, отчего может транзакция не откатыватся?
От: Tigor Россия  
Дата: 13.01.15 17:26
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Пока только нашел, что если после изменения данных выполнять запрос на создание таблицы, например, то измение данных предварительно коммитится.

AN>Что еще можно проверить?

Так вроде в Оракле все DDL операции приводят к коммиту транзакции?
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re[2]: Оракле 11, отчего может транзакция не откатыватся?
От: Tigor Россия  
Дата: 13.01.15 17:30
Оценка:
T>Так вроде в Оракле все DDL операции приводят к коммиту транзакции?

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm:
Oracle Database issues an implicit COMMIT before and after any data definition language (DDL) statement.
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re: Оракле 11, отчего может транзакция не откатыватся?
От: Softwarer http://softwarer.ru
Дата: 13.01.15 18:31
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Когда после выполнения теста смотрю ТОАД-ом — строка с INSERT находится в базе. Появляется сразу после ExecuteNonQuery.


Во многих библиотеках есть идиотская опция AUTOCOMMIT. По описанию очень похоже на её действие. Поищите какой-нибудь conn.setAutoCommit(false).
Re[2]: Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 13.01.15 21:37
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, AlexNek, Вы писали:


AN>>Когда после выполнения теста смотрю ТОАД-ом — строка с INSERT находится в базе. Появляется сразу после ExecuteNonQuery.


S>Во многих библиотеках есть идиотская опция AUTOCOMMIT. По описанию очень похоже на её действие. Поищите какой-нибудь conn.setAutoCommit(false).

искал уже, даже исходники смотрел, нет ничего подобного, только по ссылке, что привел можно найти "BeginTransaction(); // Turn off AUTOCOMMIT"
Думал уже может в таблице есть триггер с коммитом — неа
Re[2]: Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 13.01.15 21:41
Оценка:
Здравствуйте, Tigor, Вы писали:

T>Здравствуйте, AlexNek, Вы писали:


AN>>Пока только нашел, что если после изменения данных выполнять запрос на создание таблицы, например, то измение данных предварительно коммитится.

AN>>Что еще можно проверить?

T>Так вроде в Оракле все DDL операции приводят к коммиту транзакции?

отсюда

The DDL statements are:

ALTER ... (All statements beginning with ALTER)
ANALYZE
ASSOCIATE STATISTICS
AUDIT
COMMENT
CREATE ... (All statements beginning with CREATE)
DISASSOCIATE STATISTICS
DROP ... (All statements beginning with DROP)
FLASHBACK ... (All statements beginning with FLASHBACK)
GRANT
NOAUDIT
PURGE
RENAME
REVOKE
TRUNCATE

Это тоже нашел, написал в самом начале.
Нет ничего подобного.
Хотя какой нибудь SQL трасе не помешал бы.
Re: Оракле 11, отчего может транзакция не откатыватся?
От: vsb Казахстан  
Дата: 13.01.15 22:03
Оценка:
Здравствуйте, AlexNek.

Попробуйте так

OracleTransaction transaction = connection.BeginTransaction();
...
transaction.Rollback();
Re[2]: Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 13.01.15 22:55
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, AlexNek.


vsb>Попробуйте так


vsb>
vsb>OracleTransaction transaction = connection.BeginTransaction();
vsb>...
vsb>transaction.Rollback();
vsb>

Так вроде так и есть. Код просто по ссылке скопировал и заменил "коммит"
вот эта ссылка больше подходит.
Попробую еще завтра абсолютно точно так сделать.
Re[3]: Оракле 11, отчего может транзакция не откатыватся?
От: vsb Казахстан  
Дата: 14.01.15 06:27
Оценка:
Здравствуйте, AlexNek, Вы писали:

vsb>>Попробуйте так


vsb>>
vsb>>OracleTransaction transaction = connection.BeginTransaction();
vsb>>...
vsb>>transaction.Rollback();
vsb>>

AN>Так вроде так и есть. Код просто по ссылке скопировал и заменил "коммит"
AN>вот эта ссылка больше подходит.
AN>Попробую еще завтра абсолютно точно так сделать.

У вас вместо OracleTransaction написано IDbTransaction и вместо Rollback() написано RollbackTransaction(). Я .NET особо не знаю, но выглядят как разные методы. Может быть у оракла своё API.
Re[4]: Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 14.01.15 06:38
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, AlexNek, Вы писали:


vsb>>>Попробуйте так


vsb>>>
vsb>>>OracleTransaction transaction = connection.BeginTransaction();
vsb>>>...
vsb>>>transaction.Rollback();
vsb>>>

AN>>Так вроде так и есть. Код просто по ссылке скопировал и заменил "коммит"
AN>>вот эта ссылка больше подходит.
AN>>Попробую еще завтра абсолютно точно так сделать.

vsb>У вас вместо OracleTransaction написано IDbTransaction и вместо Rollback() написано RollbackTransaction(). Я .NET особо не знаю, но выглядят как разные методы. Может быть у оракла своё API.

Да, это только в приведенном коде так. Хотел показать только принцип, как делаю. Да и на работе точно такого кода нет, есть вызовы различных классов, которые делают тоже самое.
Re: Оракле 11, отчего может транзакция не откатыватся?
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 14.01.15 14:49
Оценка:
Здравствуйте, AlexNek, Вы писали:
А если попробовать использовать конструктор с указанием коннектшина и транзакции?
public OracleCommand(string commandText,OracleConnection connection,OracleTransaction tx)
С уважением, Владислав Полищук
Re[2]: Оракле 11, отчего может транзакция не откатыватся?
От: AlexNek  
Дата: 14.01.15 17:28
Оценка: 2 (1)
Здравствуйте, vladpol, Вы писали:

V>Здравствуйте, AlexNek, Вы писали:

V>А если попробовать использовать конструктор с указанием коннектшина и транзакции?
V>public OracleCommand(string commandText,OracleConnection connection,OracleTransaction tx)
Спасибо всем, нашел все таки проблему

Как переключил плагины с Оракла на MSSQL и там оказалось тоже самое, понял, что проблема может быть только в моем коде и что то не то с "соединением".
Начал рыть именно в эту сторону и нашел что соединение возвращаемое BeginTransaction неправильно сохраняется и после используется другой инстансе.
Re: Оракле 11, отчего может транзакция не откатыватся?
От: MasterZiv СССР  
Дата: 26.02.15 22:29
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Когда после выполнения теста смотрю ТОАД-ом — строка с INSERT находится в базе. Появляется сразу после ExecuteNonQuery.


AN>Пока только нашел, что если после изменения данных выполнять запрос на создание таблицы, например, то измение данных предварительно коммитится.

AN>Что еще можно проверить?

Автокоммит включен по умолчанию для этой библиотеки.
Надо выключать.
Как -- не знаю. читай доку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.