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); 
} 

トランザクションマネージャのロジックに問題がありますか?それは不安定なようです。新しいデータを挿入すると、初めて保存するように見えて、後でmysqlデータベースのデータを見つけることができません。助けてください。どうもありがとう。Spring DatasourceTransaction Manager問題

答えて

0

はい、間違っています。これは春の方法ではありません。このようなコードにコミット/ロールバックロジックを置くべきではありません。宣言的にそれを設定で行うことができるときに利点があります。

Spring transaction reference docsをご覧ください。

1

プログラム接続とトランザクション管理を行う特別な理由があるとすれば、私はSpringのJdbcTemplateを見て、それをTransactionTemplateにラップすることをお勧めします。

ただし、前のコメントで述べたように、プログラムによるトランザクション管理はできるだけ避け、注釈(@Transactional)またはXML構成(TransactionProxyFactoryBeanまたは<tx:advice/>)を使用するようにしてください。

0

補足:Springの文書によると、コミット操作がTransactionExceptionで失敗した場合、ロールバックは既に呼び出されていて、catchブロックで再度呼び出すとIllegalTransactionStateExceptionがトリガーされます。

関連する問題