Spring DatasourceTransaction Manager问题

时间:2009-04-25 03:01:57

标签: java mysql spring transactionmanager

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数据库中找到数据。请帮忙。非常感谢。

3 个答案:

答案 0 :(得分:1)

假设您想要进行编程连接和事务管理有一个特殊原因,我建议您查看Spring的JdbcTemplate并将其用于TransactionTemplate

但是,如前一条评论中所述,您应尽量避免编程事务管理,并使用注释(@Transactional)或XML配置(TransactionProxyFactoryBean<tx:advice/>)代替

答案 1 :(得分:0)

是的,有些不对劲。这不是春天的方式。你不应该在这样的代码中放置提交/回滚逻辑。当您可以在配置中以声明方式执行此操作时,优势就来了。

查看Spring transaction reference docs

答案 2 :(得分:0)

作为旁注:根据Spring文档,如果提交操作因TransactionException失败,则已经调用了回滚并在catch块中再次调用它将触发IllegalTransactionStateException。