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

Java 使用普通JDBC在DAO或服务层中处理事务,java,jdbc,transactions,dao,Java,Jdbc,Transactions,Dao,假设我有Account和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 Setter

假设我有
Account
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
}
类别付款

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方法的
AccountDao
PaymentDao
类。下一个是服务层,它有
AccountService
PaymentService
类,这些类在DAO类之上执行额外的操作

因为我使用的是货币/货币。我在我的DAO类中使用它们

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


问题: 假设我想从一个账户(发送方)向另一个账户(接收方)付款。场景如下所示:

  • 检查是否
    sender.status==0
    ,这意味着它已解锁并可以发送付款
  • 检查
    他的余额中是否有更多或相等数量的钱
    ,他想寄出去
  • 从他的帐户中取出这笔钱
  • 检查是否
    receiver.status==0
    ,这意味着它已解锁,可以接收资金
  • 在收款人账户上的存款金额
  • 将付款状态更改为1,即成功

  • 这个场景告诉我们使用两个DAO实例:
    AccountDao
    PaymentDao
    ,并从这些实例调用方法。当我在
    PaymentService
    中实现此场景时,这是实现事务的正确方法吗?

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

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

  • 这更多的是一个设计偏好的问题,那么哪一个是正确的

    这个问题看起来可能会有所帮助:看起来像是重复的。看看答案,看看这些解决方案有多糟糕,并认真考虑使用Spring之类的解决方案。这听起来像是一个解决方案,但我也担心在服务层中使用连接对象。不要这样做……我不会在代码中这样做,我会寻找其他解决方案:pHow关于创建附加层,不知道如何调用它,但是服务层和DAO层之间的层将实现我想要的。通过添加这样一个层使体系结构更加复杂可以吗?另一个Dao调用两个Dao并将连接作为参数传递?这也是一个解决办法