插入的记录在DB中提交但未手动提交

时间:2017-04-10 10:29:57

标签: database transactions h2db

我创建了一个数据库事务,我在Table1数据库的H2中插入记录。但尚未完成任何提交。 在此过程之间,执行一半记录后,我执行一个create语句(创建表2)。

Table2已创建,并且之前的INSERT语句也会在DB中提交。

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

因此,即使在事务失败后,我也会在DB中看到一些记录。我期待DB中的ZERO记录。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

因为create table是DDL语句而没有DML语句。并且DDL语句通常会提交任何打开的事务。

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

编辑2019-03-22

虽然这个话题有点陈旧,但我想提一件可以提供帮助的事情。您可以创建一个使用PRAGMA AUTONOMOUS_TRANSACTION的过程,该过程通过execute immediate

执行sql语句
PROCEDURE exec_sql_autonomous(p_sql VARCHAR2)
AS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   EXECUTE IMMEDIATE p_sql;

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

这样,您可以在数据插入事务正在进行时创建表,而不会因创建表而提交它。