Java 在Spring中何时使用Hibernate事务?

Java 在Spring中何时使用Hibernate事务?,java,spring-3,spring-transactions,hibernate3,Java,Spring 3,Spring Transactions,Hibernate3,升级我的项目我在考虑交易。 嗯,问题是我不太确定在春季何时使用事务进行Hibernate查询。 并不是说我完全不明白什么是交易,我想我明白,但是 我是否需要对get*类型查询使用事务,只需设置只读属性? <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- all methods starting with 'get' a

升级我的项目我在考虑交易。
嗯,问题是我不太确定在春季何时使用事务进行Hibernate查询。
并不是说我完全不明白什么是交易,我想我明白,但是
我是否需要对
get*
类型查询使用事务,只需设置
只读属性?

<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*
查询有效吗?
因为,在我看来,使用事务应该像
CREATE
UPDATE
DELETE
这样的查询一样进行。

我在这里遗漏了什么吗?

似乎是一个相当不错的答案,说明了为什么你应该这样做。然而,它给出了一些不这样做的理由。基本上,如果您的修改没有完成,那么当数据可能最终处于不良状态时,您希望使用它们

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

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

在我们公司,我们将所有报表(即选择、更新、删除)包装在一个事务中

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


Spring在事务管理方面有很多话要说

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

要回答有关getter的特定问题,请执行以下操作:


如果您使用只读为true的AOP事务,并且正确地将JPA方言设置为hibernate,Spring会将hibernate会话设置为无刷新模式。通过消除不必要的脏检查,这可以大大提高大容量操作的性能。因此在这方面是值得的。

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