Java 当我们做出承诺时会发生什么?

Java 当我们做出承诺时会发生什么?,java,sql,oracle,jdbc,connection,Java,Sql,Oracle,Jdbc,Connection,我正试图弄清楚当我们做出承诺时会发生什么 Connection conn=new Connection(); conn.setAutoCommit(false); PreparedStatement ps=connection.prepareStaement("insert statement 1"); ps.executeUpdate(); PreparedStatement ps2=connection.prepareStaement("insert statement 2"); ps2.e

我正试图弄清楚当我们做出承诺时会发生什么

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement 1");
ps.executeUpdate();
PreparedStatement ps2=connection.prepareStaement("insert statement 2");
ps2.executeUpdate();
conn.commit();
conn.close();
这两条准备好的语句将如何到达数据库

它们将合并到一个数据库调用中吗?还是将它们分别插入? 我的印象是,他们只需一次访问数据库。数据库接收到如下内容:

START TRANSACTION
insert statement 1
insert statement 2
COMMIT
另外,前一个与此有什么不同,此电话有多少次呼叫:

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement ?");
ps.setString(1,"1");
ps.addBatch();
ps.setString(1,"2");
ps.addBatch();
ps.executeBatch();
conn.commit();
conn.close();

除了连接/断开连接之外,第一个场景中有5个数据库调用(prepare、execute、prepare、execute、commit),第二个场景中有3个数据库调用(prepare、execute、commit)。实际上,这有点偏颇:为了使示例具有可比性,您需要在第一个场景中运行相同的语句两次,从而节省一次时间。另外,正如所评论的,一些驱动程序可能不会对prepare发出数据库调用,而是将其与第一次执行结合起来

无论如何,从概念上讲,第二个场景中的数据库调用要比第一个场景中的少一个

事务是服务器端的功能。使用事务时,对数据库的更改仅对执行这些更改的会话可见。当调用
COMMIT
时,它们将成为永久性的,并且对其他用户可见。另一方面,所属会话可以选择
回滚
,这基本上意味着:我最终放弃自上次提交以来所做的更改。您可以看到,每个代码片段都发生在单个数据库事务中。从这个角度看,它们没有什么不同


从客户端到服务器的每次调用都需要一次网络往返,这在运行大量小操作(例如,一堆
INSERT
s)时可能会很昂贵。这就是批处理发挥作用的地方:它们允许在对数据库的一次调用中执行多个操作。在这方面,第二个代码段可以更好地扩展,因为无论要处理的记录数量如何,它都会执行相同数量的数据库调用。

它们将是两个调用。您可以通过使第一次插入失败(即插入重复的主键或其他内容)来尝试此操作:使自上次提交/回滚以来所做的所有更改永久化,并释放此连接对象当前持有的所有数据库锁。正如您自己所测试的,只有一个事务,但更新将逐个命令完成。由于
executeUpdate()
返回一个更新计数,指示语句更新了多少记录,如果在您调用commit之前不执行语句,它怎么能这样做呢?--
ps.executeUpdate()
ps2.executeUpdate()
conn.commit()
是对数据库的3个单独调用。@Andreas请查看更新。谢谢批处理的整个要点是收集要一起执行的语句,以节省数据库的周转时间,那么您认为会发生什么呢?
ps.executeBatch()
conn.commit()
是对数据库的两个单独调用。“Prepare”可能是数据库调用,也可能不是数据库调用,这完全取决于JDBC驱动程序。由于调用非常昂贵,大多数JDBC驱动程序都会将任何实际准备推迟到第一次执行,因此prepare和execute可以组合成一个自调用。所以我不同意你的说法,第一种情况是3次呼叫,第二种情况是2次呼叫。@Andreas:是的,同意,我编辑了我的帖子来提到这一点。但这并没有改变我答案的整体逻辑。@GMB什么是执行,什么是提交?“执行”调用是否在数据库上插入记录?我的理解是在“提交”之前不会插入任何记录。或者我们是否通过多次呼叫发送交易,即:;调用启动事务、调用执行、调用提交?谢谢lot@super7egazi:yes execute是对数据库的调用。记录被插入,但在调用COMMIT(或ROLLBACK)之前,仅对所属会话可见。