【发布时间】:2019-02-26 23:16:34
【问题描述】:
我试图了解我们提交时究竟会发生什么
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();
【问题讨论】:
-
他们将是两个电话。您可以通过导致第一次插入失败(即插入重复的主键或其他内容)来尝试此操作
-
来自Oracle documentation:使自上次提交/回滚以来所做的所有更改永久化,并释放此 Connection 对象当前持有的所有数据库锁。正如您自己测试的那样,只有一个事务,但更新将逐个命令完成。
-
既然
executeUpdate()返回一个更新计数,表示该语句更新了多少条记录,如果它在调用commit之前不执行该语句怎么办? ---ps.executeUpdate()和ps2.executeUpdate()和conn.commit()是对数据库的 3 次单独调用。 -
@Andreas 请查看更新。谢谢!
-
批处理的全部意义在于收集要一起执行的语句,以节省数据库的周转时间,那么您认为会发生什么?
ps.executeBatch()和conn.commit()是对数据库的 2 次单独调用。
标签: java sql oracle jdbc connection