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

标签 java spring design-patterns unit-of-work jdbctemplate

我正在研究 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条committed SQL语句,而维护一个业务事务影响的对象列表,协调写出变更和并发解决的工作单元的逻辑是相反的问题

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

最佳答案

您的解释是正确的,但缺乏理解。重要的问题是:为什么尽快将每个 SQL 提交到数据库会很糟糕?

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

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

关于java - 为什么术语 "unit of work"如此重要,为什么 JDBC AutoCommit 违反了这个模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234859/

相关文章:

java - 尝试将 float 转换为 int 时遇到问题

java.util.NoSuchElementException :null(in java. util.StringTokenizer)

java - 检查表是否存在,使用java中的连接对象

java - etat HTTP 404 -/mvc/traitementTwo.jsp - spring mvc

Java Spring 4 验证失败时,它不渲染表单,而是简单地打印 View 名称

objective-c - 推荐 Objective-C 中的类设计

Java从对象列表中提取单个数据

具有不同参数的 Spring data JPA 查询

c# - 异步模式 - 当上一个任务完成时运行任务

c# - 在 NHibernate 中使用哪种算法处理多对多关系