【问题标题】:Spring DatasourceTransaction Manager ProblemSpring DatasourceTransaction Manager 问题
【发布时间】:2009-04-25 03:01:56
【问题描述】:
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 数据库中找不到数据。请帮忙。非常感谢。

【问题讨论】:

    标签: java mysql spring transactionmanager


    【解决方案1】:

    假设您有特殊原因想要进行编程连接和事务管理,我建议您查看 Spring 的 JdbcTemplate 并将其用法包装在 TransactionTemplate 中。

    不过,如上一条评论所述,您应该尽量避免程序化事务管理,而改用注解(@Transactional)或 XML 配置(TransactionProxyFactoryBean<tx:advice/>)。

    【讨论】:

      【解决方案2】:

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

      看看Spring transaction reference docs

      【讨论】:

        【解决方案3】:

        附带说明:根据 Spring 文档,如果提交操作因 TransactionException 失败,则回滚已被调用,并且在 catch 块中再次调用它将触发 IllegalTransactionStateException。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 2021-10-03
          • 2021-10-21
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多