2016-07-24 22 views
1

Die folgende Methode fügt zwei Datensätze ein (aber schreibt sie zu diesem Zeitpunkt noch nicht fest) und versucht dann, einen der nicht festgeschriebenen Datensätze aus den vorherigen Anweisungen zu lesen. Ich habe den Code mit Transaction eingepackt und den isolationLevel auf "READ_COMMITTED" gesetzt, aber das scheint nicht zu funktionieren. Die Anweisung read/"SELECT" liest die nicht festgeschriebenen Datensätze.Spring Transactions funktioniert nicht - JDBCTemplate liest nicht festgeschriebene Daten

Wie ist das möglich? Wo gehe ich falsch? Bitte sehen Sie den Code unten und helfen Sie mir. Ich würde wirklich dankbar sein ~

Hinweis:
Ich verwende BoneCP auf die Datasource zu erhalten. dbConnectionPool.initConnectionPool (dbName), ruft eine BoneCPDataSource ab.

@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

Und warum sollte es nicht funktionieren. Sie tun tatsächlich nichts, aber alles wird von einer einzigen Transaktion ausgeführt, eine Transaktion kann immer die Änderungen sehen, die sie gemacht hat. –

+0

Mögliches Duplikat von [Wie funktionieren SQL-Transaktionen?] (Http://stackoverflow.com/questions/1668166/how-do-sql-transactions-work) –

+0

@ M.Deinum Thanks! Ich habs –

Antwort

0

Wie @ M.Denium erklärte im Kommentar, ich habe versucht, alles aus einer einzigen Transaktion zu tun. Isolation Levels dienen dazu, die Konsistenz zwischen verschiedenen Transaktionen zu gewährleisten. Ich habe immer noch die Konzepte gelernt, also habe ich es falsch verstanden.