【问题标题】:where to place Transactional Spring annotation , in which layer?Transactional Spring 注释在哪里放置,在哪一层?
【发布时间】:2015-01-07 18:19:28
【问题描述】:

我对将Spring注解放置在哪一层有疑问?这是两种情况:

  1. 案例:将@Transactional放入DAO层

  2. 案例:将@Transactional放入服务层?

我只使用 Spring,而不是 SpringMVC。

【问题讨论】:

  • 除了正确答案之外,将注释放在 DAO 上也没有什么坏处,因为它会(默认情况下)重用现有事务,不要打开一个新的。
  • 我经常想知道是否应该积极鼓励这种做法,显然是通过required 传播。 @Transactional 注释在更高层中使用时拓宽了工作单元。由于 DAO 方法是可能的最细粒度的工作单元,因此理所当然地也应该对其进行注释,至少假设 RDBMS 需要事务隔离。

标签: java spring hibernate transactions annotations


【解决方案1】:

您希望您的服务是@Transactional。如果您的 DAO 是事务性的,并且您在每个服务中调用不同的 DAO,那么您将有多个事务,这不是您想要的。进行服务调用@Transactional,这些方法中的所有 DAO 调用都将参与该方法的事务。

Refer this link for more details

【讨论】:

  • 如果它使用单个 DAO,我仍然应该在服务层中 @transactional 吗?
【解决方案2】:

将其放在服务层,因为服务可能希望访问多个 DAO 方法,但这些方法仍将被视为同一业务事务的一部分。

【讨论】:

  • 如果它使用单个 DAO,我仍然应该在服务层中 @transactional 吗?
  • 从现在开始它会一直使用单个 DAO 吗?永不改变?
  • 我的意思是如果一个服务只使用一个DAO..那么我应该把它(@transactional)放在服务层吗?对于任何 CRUD 操作?
  • 是的。它包含在“服务”的整个概念中。服务调用在业务意义上是一个完整的逻辑单元,没有任何遗漏,也没有添加任何内容。 DAO 方法只是实现这一目标的工具,它是一种机械的考虑。理论上,一个 DAO 可以很容易地交换为访问文件系统的东西,或者访问一个或多个数据库的多个 DAO。
  • 性能问题:这可能值得一个单独的问题。但请考虑您的服务方法是否这样做:(1)​​访问 DAO。 (2) 对远程服务器进行 HTTP 调用。 (3) 访问另一个 DAO。您的事务将在 HTTP 调用期间打开,这可能需要一分钟才能完成。在这一点上,需要重新思考/重新设计。
【解决方案3】:

事务通常意味着你想将几个操作组合在一起 例如:

void bankTransfer(String fromAccount, String toAccount, BigDecimal amount)
{
if (amount.compareTo(BigDecimal.ZERO) < 0) throw new RuntimeException("hack attempt");
accountDao.deduct(fromAccount, amount);
accountDao.add(toAccount, amount);
}

这里的银行转账是有逻辑的。 account dao没有逻辑,只是减加。

【讨论】:

  • +1 第一个提供服务和 DAO 之间关系的实际示例
猜你喜欢
  • 2011-03-22
  • 2011-04-22
  • 2020-08-23
  • 2021-04-25
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多