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语句,这与工作单元的逻辑相反,维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决
这是正确的推理还是我遗漏了什么
# 1 楼答案
你在这方面的推理相当正确
# 2 楼答案
工作单元设计模式做两件重要的事情:第一,它维护内存中的更新,第二,它将这些内存中的更新作为一个事务发送到数据库
这一点很重要,因为您可以控制由单元工作表示的业务规则,并应用ACID原则
原子-每个工作单元都是一个全有或全无操作
一致性-从未违反数据库完整性约束
隔离-将交易彼此隔离
持久性-提交的更改是永久性的
当JDBC自动提交处于活动状态时,您就违反了ACID原则
# 3 楼答案
你的解释是正确的,但缺乏理解力。重要的问题是:当每个SQL都尽快提交到数据库时,为什么不好
要回答这个问题,您需要提出一个场景,在其中更改两个对象。变更必须以某种方式与业务规则相关联。从一个银行账户到下一个银行账户的转账就是一个常见的例子。我建议您写下所有必要的SQL语句,然后播放不同的场景,如: