插入的记录在数据库中提交而无需手动提交
Inserted records getting committed in DB without committing it manually
我创建了一个数据库事务,我正在 H2
数据库的 Table1
中插入记录。但是还没有完成任何提交。
在此过程之间,在执行了一半的记录之后,我执行了一个 create
statement(created Table2).
Table2
已创建,之前的 INSERT
语句也随之在数据库中提交。
之后,我在 Table1
中插入更多记录,如果插入失败,我仍然会在 Table1 中看到在 create
语句 [=13= 之前插入的记录].
因此,即使在交易失败后,我也会在数据库中看到一些记录。我期待数据库中的零记录。
为什么会这样?
因为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;
通过这种方式,您可以在数据插入事务正在进行时创建一个 table,而无需由于 table 创建而提交它。
我创建了一个数据库事务,我正在 H2
数据库的 Table1
中插入记录。但是还没有完成任何提交。
在此过程之间,在执行了一半的记录之后,我执行了一个 create
statement(created Table2).
Table2
已创建,之前的 INSERT
语句也随之在数据库中提交。
之后,我在 Table1
中插入更多记录,如果插入失败,我仍然会在 Table1 中看到在 create
语句 [=13= 之前插入的记录].
因此,即使在交易失败后,我也会在数据库中看到一些记录。我期待数据库中的零记录。
为什么会这样?
因为create table
是DDL语句,没有DML语句。而 DDL 语句通常会提交任何打开的事务。
如果您想避免这种情况,您应该在导入第一条记录之前创建导入过程中需要的所有对象。
编辑 2019-03-22
虽然这个话题有点老了,但我想提一件事可能会有所帮助。您可以创建一个使用 PRAGMA AUTONOMOUS_TRANSACTION
的过程,该过程通过 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;
通过这种方式,您可以在数据插入事务正在进行时创建一个 table,而无需由于 table 创建而提交它。