我创建了一个数据库事务,我在Table1
数据库的H2
中插入记录。但尚未完成任何提交。
在此过程之间,执行一半记录后,我执行一个create
语句(创建表2)。
Table2
已创建,并且之前的INSERT
语句也会在DB中提交。
在此之后,我在Table1
中插入了更多记录,如果插入失败,我仍然会在Table1中看到create
语句Table2
之前插入的记录。
因此,即使在事务失败后,我也会在DB中看到一些记录。我期待DB中的ZERO记录。
为什么会这样?
答案 0 :(得分:1)
因为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;
这样,您可以在数据插入事务正在进行时创建表,而不会因创建表而提交它。