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;
通过这种方式,您可以在数据插入事务正在进行时创建一个表,而无需由于创建表而提交该表。是否有其他方法来实现此目的?我想尽可能地延迟表的创建。因此,如果有该表的条目,并且我们需要它,那么只有我们创建该表。文档中提到创建表:“该命令提交一个打开的事务,使用事务时除外(仅支持临时表)。”