Транзакции не работают для SubSonic под Oracle? - PullRequest
1 голос
/ 26 марта 2010

Следующий пример кода отлично работает под SQL Server 2005:

using (TransactionScope ts = new TransactionScope()) {
            using (SharedDbConnectionScope scope = new SharedDbConnectionScope()) {
                MyTable t = new MyTable();
                t.Name = "Test";
                t.Comments = "Comments 123";
                t.Save();
                ts.Complete();
            }
        }

Но в Oracle 10g выдается ошибка «ORA-02089: COMMIT не разрешен в подчиненном сеансе». Если я только выполняю код внутри блока SharedDbConnectionScope, то все работает хорошо, но, очевидно, я не смогу выполнять операции в транзакции, что может привести к повреждению данных.

Это лишь небольшой пример того, что делает мое настоящее приложение. Я не уверен относительно того, что может быть причиной такого поведения; Кто-нибудь хочет прояснить этот вопрос, пожалуйста?


вот конфиг:

<configSections> <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/> </configSections> <connectionStrings> <add name="OracleConnection" connectionString="Data Source=XE;User Id=test;Password=test;"/> </connectionStrings> <SubSonicService defaultProvider="OracleProvider"> <providers> <clear/> <add name="OracleProvider" type="SubSonic.OracleDataProvider, SubSonic" connectionStringName="OracleConnection" generatedNamespace="OracleTest" /> </providers> </SubSonicService> 

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Поиск вверх этого конкретного сообщения об ошибке предполагает, что что-то может пытаться явно или неявно COMMIT.

Если вы посмотрите на OracleDataProvider.cs , внутри GetInsertSql (Query qry) выдается явный COMMIT:

    if (retrieveID)
        insertSQL.AppendFormat("  RETURNING {0} INTO :lllhhhmmm; COMMIT; END; ", qry.Schema.PrimaryKey.ColumnName);

COMMIT также вызывается в ExecuteScalar () в том же файле. Вы по-прежнему видите проблему при обновлении записей вместо их вставки?

0 голосов
/ 29 сентября 2011

Попробуйте удалить

using (TransactionScope ts = new TransactionScope())

и используйте только SharedDbConnectionScope, например:

        SharedDbConnectionScope scope = new SharedDbConnectionScope();
        using (scope) {
            MyTable t = new MyTable();
            t.Name = "Test";
            t.Comments = "Comments 123";
            t.Save();
            scope.commit();
        }
...