当前位置: 首页 > 知识库问答 >
问题:

使用普通JDBC在DAO或服务层中处理事务

高山
2023-03-14

假设我有类帐户Payment

班级帐户

public class Account {
    private Integer id;
    private Integer accountHolderId;
    private BigDecimal balance;
    private Byte status;  // 0: account is fine, 1: locked, can't make payments.

    // Getters and Setters
}

班级付款

public class Payment {
    private Integer id;
    private BigDecimal amount;
    private Integer senderId;
    private Integer receiver;
    private Integer paymentStatusId;

    // Getters and Setters
}


DAO层有实现CRUD方法的AcCountDaoPaymentDao类。下一个是服务层,它有AcCountServicePaymentService类,它们在DAO类之上执行其他操作。

因为我使用的是货币/货币,所以我使用的是交易。我在我的DAO课程中使用它们。

我的DaoFactory类有一个方法createConnection(),该方法为每个特定的DaoFactory(例如MySqlDaoFactory)返回一个连接对象,该对象使用连接启用了事务功能。设置自动提交(错误) 。因此,每次连接到数据库时,我都会手动使用commit()rollback()方法。

假设我想从一个账户(发送方)向另一个账户(接收方)付款。情况如下:

  1. 检查是否sender.status==0,这意味着它是解锁的,可以发送付款。
  2. 检查他的余额上是否有更多或相等的钱。
  3. 从他的账户里取出这笔钱。
  4. 检查是否receiver.status==0,这意味着它是解锁的,可以收到钱。
  5. 在收款人的账户上存一笔钱。
  6. 将付款状态更改为1,即为成功。

这个场景告诉我们使用两个DAO实例:AcCountDaoPaymentDao以及从这些实例调用方法。当我在PaymentService中实现这个场景时,它是实现事务的正确方式吗?

共有1个答案

梅欣然
2023-03-14

由于您不使用某些框架,如Spring Transaction(我强烈建议您使用),我建议您执行以下操作:

  1. 只需使用一个DAO类就可以创建您需要的所有业务流程,并在那里使用事务
  2. 在服务层中创建连接,并将其作为参数传递给业务流程中需要的所有DAO。我不喜欢这种方式,因为你会将连接控制委托给服务层,也不会委托给数据访问层
  3. 将JDBC更改为使用Spring事务,它将允许您注释服务层中同一事务中的方法,尽管它们位于不同的DAO中。这是因为Spring将控制连接,所以它将通过DAO注入相同的连接。看看这个例子

这更多的是一个设计偏好的问题,然后哪一个是正确的

 类似资料:
  • 问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 问题内容: 首先,可能是我要问一些以前已经问过并回答过的问题,但我却无法找回搜索结果。一般而言(或到目前为止):)我们在服务层上定义事务注释,通常是Spring Hibernate Crud。 现在,我需要根据客户站点在域模型之间进行选择。假设客户端A使用我的域模型都很好,但是另一个客户端网站会给我一个Web服务而不是使用我们的域模型。 我应该替换哪一层。我认为必须是DAO,它将从Web服务获取我

  • 问题内容: 我目前正在使用带有Spring插件和hibernate的Struts2开发一个Web应用程序,并且在查看在线示例时,我看到了Service和DAO层的使用,现在才知道Service和数据访问对象层的真正用途是什么?如果服务层只是在调用DAO层的方法来执行CRUD操作。直接调用DAO层方法不明智吗? 假设此示例为Dao和Service Layer 人员服务 人道 我的问题是,如果仅将服务

  • 我的项目中有普通的jdbc连接池,并使用ejb进行事务处理。现在我想将事务管理更改为Spring事务管理,但我不想为此创建单独的数据源,我想使用相同的普通连接池。 有可能吗? 下面是我的Springbean for transaction(数据源是空的,因为我不知道如何从普通的jdbc连接池进行设置)

  • 我正在尝试使用Spring MVC处理自定义异常处理。服务层DAO层异常处理程序和服务层对异常进行包装,并由Spring MVC的控制器异常处理程序对异常进行处理。以下是我的代码: 在上面的代码中,DAO层的异常处理在服务层,并将该异常包装在自定义异常中,然后抛出该异常。