2016-07-24 2 views
1

Следующий метод вставляет две записи (но не фиксирует их в этой точке), а затем пытается прочитать одну из незафиксированных записей из предыдущих операторов. Я завернул код Transaction и установил для параметра изоляцииLevel значение «READ_COMMITTED», но это, похоже, не работает. Оператор read/"SELECT" считывает незафиксированные записи.Весенние транзакции не работают - JDBCTemplate считывает незафиксированные данные

Как это возможно? Где я иду не так? См. Код ниже и помогите мне. Я был бы очень благодарен ~

Примечание:
Я использую BoneCP получить DataSource. dbConnectionPool.initConnectionPool (dbName), получит источник BoneCPDataSource.

@Override public void testDBCalls() { 
    dBConnectionPool.initConnectionPool("titans");  
    DataSource dataSource = dBConnectionPool.getDataSource("titans"); 
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); 

    definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
    definition.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); 
    definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 

    DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource);  TransactionStatus 
    transactionStatus = txManager.getTransaction(definition); 

    try {   
     try { 

      JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 

      String sql = "INSERT INTO groundwater(external_id,source_type) VALUES (12, 13);"; 
      jdbcTemplate.update(sql); 
      System.out.println("Successfully inserted - 1"); 

      String sql2 = "INSERT INTO groundwater(external_id, source_type,) VALUES(123,45);"; 
      jdbcTemplate.update(sql2); 
      System.out.println("Successfully inserted - 2"); 

      String sql3 = "select gw_id from groundwater where external_id= 123;"; 
      System.out.println("Result : "+jdbcTemplate.queryForInt(sql3)); 

      txManager.commit(transactionStatus); 
      System.out.println("Commiting the trasaction..."); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      txManager.rollback(transactionStatus); 
      System.out.println("Rolling back the transaction"); 

     } 
    } finally { 
     try { 
      dataSource.getConnection().close(); 
      System.out.println("Closing the connection ...");  
     } catch (SQLException e) { 
      e.printStackTrace();    
     } 
    } 
} 
+1

И почему это не должно работать. Вы действительно ничего не совершаете, но все выполняется из одной транзакции, транзакция всегда может видеть изменения, которые она сделала. –

+0

Возможный дубликат [Как работают SQL-транзакции?] (Http://stackoverflow.com/questions/1668166/how-do-sql-transactions-work) –

+0

@ M.Deinum Спасибо! Понял –

ответ

0

Как @ M.Denium объяснил в комментарии, я пытался сделать все, что от одной транзакции. Уровни изоляции предназначены для поддержания согласованности между различными транзакциями. Я все еще изучал концепции, поэтому я принял это неправильно.

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