【问题标题】:When to use transactions in Spring with Hibernate?何时在 Spring 和 Hibernate 中使用事务?
【发布时间】:2011-08-25 00:49:34
【问题描述】:

升级我的项目我在这里考虑交易。
好吧,问题是我不太确定我应该什么时候使用事务在 Spring 中进行 Hibernate 查询。
并不是说我完全不明白什么是交易,我想我知道,但是
我是否需要将交易用于 get* 类型的查询,只需设置 read-only 属性?

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- all methods starting with 'get' are read-only -->
        <tx:method name="get*" read-only="true" />
        <!-- other methods use the default transaction settings -->
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

这对get* 查询有效吗?
因为,就我而言,应该像CREATEUPDATEDELETE 和此类查询一样使用事务。
我在这里遗漏了什么吗?

【问题讨论】:

标签: java spring-3 spring-transactions hibernate3


【解决方案1】:

This 似乎是一个相当不错的答案,为什么你应该这样做。但是,this 给出了一些不这样做的理由。基本上,如果您的修改未完成,您希望在数据最终处于不良状态时使用它们。

【讨论】:

    【解决方案2】:

    使用事务在某种程度上取决于要求。

    显然,在 UPDATE 和 DELETE 操作上使用事务是有意义的。例如,如果您需要锁定记录以使另一个线程/请求不会更改读取,则在 SELECT 语句上使用事务也可能很有用。这通常是业务需求。

    在我们公司,我们确实将所有语句(即 SELECT、UPDATE、DELETE)包装在一个事务中。

    此外,事务管理确实更适合除数据级别之外的另一层。一般来说,交易会与业务需求相匹配。例如,如果要求将钱存入帐户,则应使用一些更高级别的类/代码将整个方法标记为事务性,因为该特定方法需要作为一个单元完成(因为可能有多个数据库来电)。

    Spring 对事务管理有很多话要说。

    【讨论】:

    • 我通常还会将访问数据库的每个业务操作都包装在事务中。最近我想知道这是否会导致任何可能减慢应用程序的开销。在这种情况下,仅将事务用于创建、删除、更新是否有意义?
    • 我们公司要求我们在每次交易后提交,甚至是SELECT语句。我当然可以看到只包装 UPDATE 语句会产生更少的开销。
    【解决方案3】:

    一个好的规则是在 DAO 之上的应用程序级别管理事务。这样,如果您有一个数据访问操作 A,有时需要在自己的事务中执行,有时应该加入现有事务,您就不必跳过这些环节。将此方法与通过 AOP 管理事务(和 Hibernate 会话)相结合,让您的代码变得更易于理解和维护。

    【讨论】:

      【解决方案4】:

      回答您关于吸气剂的具体问题:

      如果您使用带有 readOnly true 的 AOP 事务,并且您正确地将您的 JPA 方言设置为休眠,Spring 会将您的休眠会话置于无刷新模式。通过消除不必要的脏检查,这可以显着提高大量操作的性能。所以在这方面是值得的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2014-11-20
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多