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(); } } }
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. –
Mögliches Duplikat von [Wie funktionieren SQL-Transaktionen?] (Http://stackoverflow.com/questions/1668166/how-do-sql-transactions-work) –
@ M.Deinum Thanks! Ich habs –