11

升级我的项目我在这里考虑交易。
好吧,问题是我不太确定什么时候应该在 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*查询有效吗?
因为,就我而言,应该像 for CREATEUPDATEDELETE这样的查询那样使用事务。
我在这里错过了什么吗?

4

4 回答 4

12

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

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

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

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

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

于 2011-05-13T15:18:41.633 回答
3

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

于 2011-05-13T16:31:49.840 回答
2

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

于 2011-05-13T15:14:08.430 回答
0

要回答有关吸气剂的具体问题:

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

于 2011-05-13T17:00:47.427 回答