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データベースにデータが見つかりません。助けてください。どうもありがとう。

4

3 に答える 3

1

プログラムによる接続とトランザクション管理を行いたい特別な理由があると仮定すると、Spring を見て、JdbcTemplateその使用法を .xml でラップすることをお勧めしTransactionTemplateます。

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

于 2009-07-08T22:49:41.193 に答える
0

はい、何か問題があります。これは春のやり方ではありません。このようなコードにコミット/ロールバック ロジックを入れるべきではありません。利点は、構成で宣言的に実行できる場合です。

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

于 2009-04-25T10:14:37.707 に答える
0

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

于 2012-09-24T18:14:44.693 に答える