Database 插入的记录在数据库中提交,而不手动提交

Database 插入的记录在数据库中提交,而不手动提交,database,transactions,h2db,Database,Transactions,H2db,我已经创建了一个数据库事务,正在H2DB的Table1中插入记录。但还没有做出任何承诺。 在此过程之间,在执行了一半记录之后,我执行了一条create语句(created Table2) Table2被创建,同时,前面的INSERT语句也在数据库中提交 在此之后,我将在Table1中插入更多记录,如果插入失败,我仍会在Table1中看到在create语句之前为Table2插入的记录 因此,即使在事务失败后,我也会在DB中看到一些记录。我希望数据库中没有记录 为什么会发生这种情况?因为create

我已经创建了一个数据库事务,正在
H2
DB的
Table1
中插入记录。但还没有做出任何承诺。 在此过程之间,在执行了一半记录之后,我执行了一条
create
语句(created Table2)

Table2
被创建,同时,前面的
INSERT
语句也在数据库中提交

在此之后,我将在
Table1
中插入更多记录,如果插入失败,我仍会在Table1中看到在
create
语句之前为
Table2
插入的记录

因此,即使在事务失败后,我也会在DB中看到一些记录。我希望数据库中没有记录


为什么会发生这种情况?

因为
create table
是DDL语句,而不是DML语句。DDL语句通常提交任何打开的事务

如果要避免这种情况,应在导入第一条记录之前,在导入过程中创建所需的所有对象

编辑2019-03-22

虽然这个话题有点老了,但我想提一件有帮助的事情。您可以创建一个过程,该过程使用
PRAGMA autonomy_TRANSACTION
,通过
executeimmediate

PROCEDURE exec_sql_autonomous(p_sql VARCHAR2)
AS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   EXECUTE IMMEDIATE p_sql;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;
      RAISE;
END;

通过这种方式,您可以在数据插入事务正在进行时创建一个表,而无需由于创建表而提交该表。

是否有其他方法来实现此目的?我想尽可能地延迟表的创建。因此,如果有该表的条目,并且我们需要它,那么只有我们创建该表。文档中提到创建表:“该命令提交一个打开的事务,使用事务时除外(仅支持临时表)。”