为什么术语 "unit of work" 如此重要,为什么 JDBC AutoCommit 违反了这个模式?

Why is the term "unit of work" so important and why does JDBC AutoCommit violate this pattern?

我正在研究Spring如何处理交易,我无法准确回答以下基于研究material的问题:

Why is the term "unit of work" so important and why does JDBC AutoCommit violate this pattern?

所以,我知道工作单元是一种设计模式,维护受业务事务影响的对象列表并协调写出并发问题的变化和解决.

所以我知道使用 Spring JdbcTemplate 我可以得到这样的东西:

try {
    conn = dataSource.getConnection();
    conn.setAutoCommit(false);
    …
    conn.commit();
} catch (Exception e) {
    conn.rollback();
    ...
}

其中 conn.setAutoCommit(false); 是一个 程序化事务划分 (因为在这种情况下我以编程方式声明我的前一个操作和最终提交操作之间发生的所有事务)。

所以,据我了解(但它可能是错误的)。如果相反,我有:

conn.setAutoCommit(true);

此语句和最终提交之间的每个单独 SQL 语句都被视为一个事务,并在执行后立即自动提交。因此,通过这种方式,我将提交 n 个 SQL 语句,这与 维护受业务事务影响的对象列表并协调写出的工作单元的逻辑相反并发问题的变化和解决.

推理正确还是我遗漏了什么?

你的推理在这方面是相当合理的。

你的解释是正确的,但缺乏理解。重要的问题是:当每个 SQL 尽快提交到数据库时为什么不好?

要回答这个问题,您需要想出一个更改两个对象的场景。更改必须以某种方式与业务规则相关。将钱从一个银行账户转移到另一个银行账户是这里的一个常见示例。我建议您写下所有必要的 SQL 语句,然后玩不同的场景,例如:

  • 语句的顺序重要吗?
  • 当没有执行所有语句时会发生什么?

工作单元设计模式做了两件重要的事情:首先它维护内存中的更新,其次它将这些内存中的更新作为一个事务发送到数据库。

这很重要,因为您可以控制单元工作所代表的业务规则并应用 ACID 原则

  • Atomic - 每个工作单元都是一个全有或全无的操作。

  • 一致 - 永远不会违反数据库完整性约束

  • Isolated - 相互隔离事务

  • 持久 - 提交的更改是永久性的

当 JDBC AutoCommit 处于活动状态时,您就违反了 ACID 原则。