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数据库中找到数据。请帮忙。非常感谢。
答案 0 :(得分:1)
假设您想要进行编程连接和事务管理有一个特殊原因,我建议您查看Spring的JdbcTemplate
并将其用于TransactionTemplate
。
但是,如前一条评论中所述,您应尽量避免编程事务管理,并使用注释(@Transactional
)或XML配置(TransactionProxyFactoryBean
或<tx:advice/>
)代替
答案 1 :(得分:0)
是的,有些不对劲。这不是春天的方式。你不应该在这样的代码中放置提交/回滚逻辑。当您可以在配置中以声明方式执行此操作时,优势就来了。
答案 2 :(得分:0)
作为旁注:根据Spring文档,如果提交操作因TransactionException失败,则已经调用了回滚并在catch块中再次调用它将触发IllegalTransactionStateException。