2016-07-24 11 views
1

次のメソッドは2つのレコードを挿入しますが、この時点ではコミットしません。トランザクションでコードをラップし、isolationLevelを "READ_COMMITTED"に設定しましたが、これは動作していないようです。読み取り/ "SELECT"ステートメントはコミットされていないレコードを読み取ります。Springトランザクションが機能していない - JDBCTemplateがコミットされていないデータを読み取っています

これはどのように可能ですか?どこが間違っていますか?下記のコードを見て、私を助けてください。私は本当に感謝するでしょう〜

注:
私はDataSourceを取得するためにBoneCPを使用しています。 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

@MDeinumありがとう!とった –

答えて

0

M.Deniumコメントで説明@として、私は単一のトランザクションからすべてをやろうとしました。分離レベルは、さまざまなトランザクション間で一貫性を維持するためのものです。私はまだコンセプトを学んでいたので、間違った方法でそれを取りました。

関連する問題