2012-06-26 6 views
1

Моя цель состоит в том, чтобы:Несколько соединений, состояния сеанса

  • 1 постоянные данные подключения к базе данных и транзакций, которые вставляет/обновлены, и могут быть совершены или откат, когда вся работа сделана

  • «at-will» открытые несвязанные соединения, которые НЕ разделяют состояние сеанса с постоянным подключением - это означает, что они «видят» старые данные. Эти соединения нужно читать, а не писать.

Я попытался открыть совершенно новое соединение, но он видит изменения, вызванные постоянным подключением. Можно ли это достичь?

Примечание: Я использую то же имя пользователя и пароль Oracle для всех подключений.

Примечание 2: Жаба (программное обеспечение для Oracle DB) не «видит» изменения, сделанные постоянным соединением, пока они не будут зафиксированы. Если они откатываются назад, они не появляются в базе данных, когда они совершаются, они это делают. Эта часть работает нормально, просто другое соединение, открытое из моего приложения, видит их до их совершения.

Вот код для моего соединения, которое видит изменения, которые не должны видеть:

using (OracleConnection readConnection = new 
     OracleConnection(Settings.OracleConnectionString)) 
{ 
    readConnection.Open(); 

    using (OracleCommand command = new OracleCommand(lastOracleRowQuery, 
                readConnection)) 
    { 
     using (OracleDataReader reader = command.ExecuteReader()) 
     { 
      if (reader.Read()) 
      { 
       for (int i = 0; i < reader.FieldCount; i++) 
        compareValues.Add(reader.IsDBNull(i) ? 
         null : 
         reader.GetValue(i)); 
      } 
     } 
    } 
} 

Это происходит в то время как есть другой OracleConnection открытым, и транзакция с использованием этого соединения. Однако не следует ли прочитатьСоединение полностью не связанным?

Результат этого чтения дает результаты, которые не отображаются при одновременном использовании одного и того же запроса в Toad.

решаемые

Видимо, Oracle совершает сессию "CREATE TABLE", даже если таблица создать не удается, ничего не делает и бросает исключение. Я не ожидал такого поведения, так меня это смутило. Когда я начинал создавать все таблицы, все начинало работать. Во время моего тестирования на самом деле не создавались таблицы, поэтому я не думал, что это проблема, но когда я очистил код и перенесли его на начало, все исправлено.

Я все еще не понимаю, что происходило с Жабой. Возможно, я ошибся или что-то еще. Или есть больше ошибок, о которых я еще не знаю. : D

+0

Если вы используете чтение по умолчанию, возможно, вы используете одно и то же соединение/сеанс для обоих? (Пулы). – tbone

+0

Соединения - это полностью отдельный объект, за исключением двух вещей: оба используют одно и то же имя пользователя/пароль, а функция, которая создает «прочитанное» соединение, вызывается с использованием «использующего» блока постоянного соединения и транзакции. – svinja

+0

Что вы подразумеваете под пулом? – svinja

ответ

0

Если вы используете System.Transaction.TransactionScope, то все соединения, созданные в пределах области действия, будут обрабатываться как одна транзакция, и поэтому данные, созданные вашим постоянным соединением, будут видны для прочитанного соединения.

Вы должны создать новый TransactionScope в текущей области действия с параметром scope как TransactionScopeOption.Suppress, создать соединение чтения в этой области и выполнить операцию чтения в этой новой области. Ваш код будет выглядеть следующим образом.

//Outer Transaction   
using (TransactionScope t = new TransactionScope()) 
{ 
     //Create persistence connection and command 
     // Execute persistence commands 
     //Inner scope to suppress the outer transaction 
    using (TransactionScope t1 = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     //create read connection 
     // Execute read operation 
    } 
    //continue with write operation 
} 
+0

Это объясняет мою проблему, но я не, я использую транзакцию OracleTransaction = connection.BeginTransaction(), затем command.Transaction = transaction; – svinja