如何使用 Guice 在 Spring JDBC 中使用事务

Posted

技术标签:

【中文标题】如何使用 Guice 在 Spring JDBC 中使用事务【英文标题】:How to use transaction in Spring JDBC with Guice 【发布时间】:2013-06-05 22:06:56 【问题描述】:

我是 Spring JDBC 的新手。我创建了一个 DAO,其界面如下:

@ImplementedBy(StuffDAOImpl.class)
public interface StuffDAO 
    void createStuff(StuffDTO stuffDTO);
    @Transactional
    void updateStuff(StuffDTO stuffDTO);

如何将 updateStuff 配置为事务性的,例如,如果方法中有两个更新:

@Override
@Transactional
public void updateStuff(StuffDTO stuffDTO) 
    String query = "UPDATE stuff SET (name, username, password) = (?, ?, ?) WHERE rowid = 10";
    getJdbcTemplate().update(query, new Object[]"John", "john", "12345");

    // This will fail
    try 
        String wrongquery = "UPDATE tablenotexist SET (name, username, password) = (?, ?, ?) WHERE rowid = 10";
        getJdbcTemplate().update(wrongquery, new Object[]"John", "john", "12345");
    catch (BadSqlGrammarException e) 
        // IGNORE
    

在上面的示例中,第二个查询将失败,因为它试图更新一个不存在的表。我认为通过将这种方法声明为一项事务,它应该达到目的。但是它似乎不起作用。

如果此方法运行,我如何使查询也回滚?

顺便说一下,我使用Guice而不是Spring来做DI。

非常感谢

【问题讨论】:

如果你说它没有回滚,那么 @Transactional 配置不正确。 @Kevin 你最终得到了这个结果吗?我正在为 DI 使用 Guice,并希望使用 Spring JDBC + 事务 【参考方案1】:

您使用的是 Spring JDBC、Spring 事务,但是 Guice 用于 DI?为什么?你让事情变得比需要的复杂得多。

您的对象可能不是 Spring bean,因为 Spring 不会创建和注入它们,所以 @Transactional 没有效果:Spring 不会创建和注入对象,因此它不会创建和注入事务代理,所以注释永远不会被任何东西使用。

【讨论】:

感谢您的回答。使用 Guice 是我团队的要求之一,这是我无法改变的。如果 Spring JDBC 不能以这种方式工作,您可以建议 Spring JDBC 的替代方案吗?我确实考虑过 JOOQ,但它似乎根本不提供事务支持。

以上是关于如何使用 Guice 在 Spring JDBC 中使用事务的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat Guice/JDBC 内存泄漏

Junit 5 如何使用 Guice DI

Google Guice、Google Gin 和 Spring

Google 开源的依赖注入库,比 Spring 更小更快!

史上最好用的依赖注入框架Google Guice转

guice整合struts2,guice的使用