0

我已经创建了一个数据库事务,并且正在将记录插入Table1DB H2。但尚未完成任何提交。在此过程之间,在执行了一半的记录后,我执行了一条create语句(创建了 Table2)。

Table2被创建并且与它一起,以前INSERT的语句也被提交到数据库中。

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

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

为什么会这样?

4

1 回答 1

1

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

如果您想避免这种情况,您应该在导入第一条记录之前创建导入期间需要的所有对象。

编辑 2019-03-22

虽然这个话题有点老了,但我想提一件事可能会有所帮助。您可以创建一个过程,该过程使用PRAGMA AUTONOMOUS_TRANSACTION它通过以下方式执行 sql 语句execute immediate

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

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

这样,您可以在数据插入事务正在进行时创建表,而无需由于表创建而提交它。

于 2017-04-10T10:32:47.433 回答