2009-04-25 5 views
0
final DataSource ds = DataSourceLocator.getInstance() 
    .getDataSource(sg.cmpl.starhub.lprs.Constants.APP_KEY); 
final DataSourceTransactionManager txManager = new DataSourceTransactionManager(); 
txManager.setDataSource(ds); 

final DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
final TransactionStatus status = txManager.getTransaction(def); 

Connection conn = null; 
PreparedStatement ps = null; 

try { 

    /***************************************************************************/ 
    conn = DataSourceUtils.getConnection(ds); 
    ps = conn.prepareStatement(sql); 
    ps.execute(); 
    /***************************************************************************/ 

    txManager.commit(status); 

} catch (Exception e) { 
    txManager.rollback(status); 
} 

Ist etwas mit meiner Transaktionsmanagerlogik nicht in Ordnung? Es sieht wie instabil aus. Wenn ich neue Daten einfüge, scheint es zum ersten Mal zu speichern und später kann ich die Daten in MySQL-Datenbank nicht finden. Bitte helfen Sie. Danke vielmals.Spring DatasourceTransaction Manager Problem

Antwort

0

Ja, da stimmt etwas nicht. Dies ist nicht der Frühlingsweg. Sie sollten keine Commit/Rollback-Logik in Code wie diesem setzen. Der Vorteil kommt, wenn Sie es in der Konfiguration deklarativ tun können.

Werfen Sie einen Blick auf die Spring transaction reference docs.

1

Angenommen, es gibt einen speziellen Grund, warum Sie programmatische Verbindung und Transaktionsverwaltung tun möchten, empfehle ich einen Blick auf Spring JdbcTemplate und wickeln Sie die Verwendung in einem TransactionTemplate.

jedoch wie im vorherigen Kommentar erwähnt, sollten Sie versuchen, programmatisches Transaktionsmanagement so weit wie möglich zu vermeiden und verwenden Anmerkungen (@Transactional) oder XML-Konfiguration (TransactionProxyFactoryBean oder <tx:advice/>) statt.

0

Als eine Randnotiz: nach Spring-Dokumentation, wenn commit-Vorgang mit TransactionException fehlschlägt, Rollback wurde bereits aufgerufen und erneut aufrufen in catch-Block wird IllegalTransactionStateException auslösen.