有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么术语“工作单元”如此重要,为什么JDBC自动提交违反了这种模式?

我正在研究Spring如何处理事务,根据研究材料,我无法准确回答以下问题:

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

因此,我知道,工作单元是一种设计模式,维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决

所以我知道,使用SpringJdbcTemplate我可以得到如下内容:

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

其中连接设置自动提交(假)是一个编程事务划分(因为在本例中,我以编程方式声明我的事务,这是在上一个操作和最终提交操作之间发生的所有事务)

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

conn.setAutoCommit(true);

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

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


共 (3) 个答案

  1. # 1 楼答案

    你在这方面的推理相当正确

  2. # 2 楼答案

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

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

    • 原子-每个工作单元都是一个全有或全无操作

    • 一致性-从未违反数据库完整性约束

    • 隔离-将交易彼此隔离

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

    当JDBC自动提交处于活动状态时,您就违反了ACID原则

  3. # 3 楼答案

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

    要回答这个问题,您需要提出一个场景,在其中更改两个对象。变更必须以某种方式与业务规则相关联。从一个银行账户到下一个银行账户的转账就是一个常见的例子。我建议您写下所有必要的SQL语句,然后播放不同的场景,如:

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