Spring Datasource事务管理器问题

发布于 2024-07-18 04:05:48 字数 963 浏览 9 评论 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数据库中找不到数据。 请帮忙。 多谢。

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

Is there something wrong with my transaction manager logic? It looks like unstable. When I insert new data, First time it seems to save and later I can't find the data in mysql database. Please help. Thanks a lot.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

执妄 2024-07-25 04:05:48

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

然而,正如前面的评论所述,您应该尽可能避免编程式事务管理,并使用注释(@Transactional)或 XML 配置(TransactionProxyFactoryBean) 来代替。

Assuming there's a special reason you want to do programmatic connection and transaction management I suggest taking a look at Spring's JdbcTemplate and wrap it's usage in a TransactionTemplate.

However as stated in the previous comment, you should try to avoid programmatic transaction management as much as possible and use annotations (@Transactional) or XML configuration (TransactionProxyFactoryBean or <tx:advice/>) instead.

你曾走过我的故事 2024-07-25 04:05:48

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

查看 Spring 事务参考文档

Yes, there is something wrong. This is not the Spring way. You should not be putting commit/rollback logic in code like this. The advantage comes when you can do it declaratively, in configuration.

Have a look at the Spring transaction reference docs.

留一抹残留的笑 2024-07-25 04:05:48

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

As a side note: according to Spring documentation if commit operation fails with TransactionException then rollback was already called and calling it again in catch block will trigger IllegalTransactionStateException.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文