Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中开始事务-在自动提交中回滚_Oracle_Plsql_Oracle11g_Transactions - Fatal编程技术网

在Oracle中开始事务-在自动提交中回滚

在Oracle中开始事务-在自动提交中回滚,oracle,plsql,oracle11g,transactions,Oracle,Plsql,Oracle11g,Transactions,我正在从SQL Server迁移到Oracle,我发现在Oracle中,默认情况下自动提交是禁用的,但我的问题是,当启用自动提交时,如何回滚事务?SQL Server中有Begin-tran语句,Oracle呢?Oracle中没有与Begin-tran等价的语句 Oracle在我们第一次运行某个DML时隐式启动事务。事务将一直扩展到我们发出提交或回滚。请注意,在Oracle DDL中,命令在执行之前和之后都会发出隐式提交;因此,我们不仅不能回滚CREATETABLE语句,而且不能回滚CREATE

我正在从SQL Server迁移到Oracle,我发现在Oracle中,默认情况下自动提交是禁用的,但我的问题是,当启用自动提交时,如何回滚事务?SQL Server中有
Begin-tran
语句,Oracle呢?

Oracle中没有与
Begin-tran
等价的语句

Oracle在我们第一次运行某个DML时隐式启动事务。事务将一直扩展到我们发出提交或回滚。请注意,在Oracle DDL中,命令在执行之前和之后都会发出隐式提交;因此,我们不仅不能回滚CREATETABLE语句,而且不能回滚CREATETABLE语句之前执行的任何DML语句

在我的书中,Autocommit是一种反模式:事务是一个工作单元,在所有应用程序中,除了最琐碎的应用程序外,它都是一系列语句。在每条语句之后提交会导致不一致、不可恢复和(可能)数据损坏

但是,要回答这个问题:Autocommit在语句级别提交。因此,无法回滚单个成功完成的事务。因此,如果希望将多个DML语句合并到一个事务中,并可能回滚不完整的工作单元,则需要将这些语句分组到PL/SQL块中

这里我们有一个PL/SQL块,它在单个语句中插入一些记录

begin
    insert into t23 (id) values (1);
    insert into t23 (id) values (2);
    insert into t23 (id) values (3);
    insert into t23 (id) values (4);
    insert into t23 (id) values (1);
exception
    when dup_val_on_index then
        rollback;
        raise;
end;
/
如果我们在一个有自动提交功能的客户机上运行这个块,它将插入零条记录。Autocommit在执行级别上运行,在本例中,执行级别是块:要么全部成功并提交,要么失败且未提交。因此,第五次插入未能通过主键验证将触发前四次插入的回滚

注意,即使在异常处理程序中没有显式回滚,也会回滚四个插入。阻止失败,事务未提交


那么这个选项是关于什么的呢?:
tools-preferences-database-advance-autocommit复选框


这是来自客户端IDE(Oracle SQL Developer?)的菜单路径。AUTOCOMMIT是一个客户端选项,它在客户端执行每个语句后都会发出一个commit。

Oracle中没有与
begin tran
等效的语句

Oracle在我们第一次运行某个DML时隐式启动事务。事务将一直扩展到我们发出提交或回滚。请注意,在Oracle DDL中,命令在执行之前和之后都会发出隐式提交;因此,我们不仅不能回滚CREATETABLE语句,而且不能回滚CREATETABLE语句之前执行的任何DML语句

在我的书中,Autocommit是一种反模式:事务是一个工作单元,在所有应用程序中,除了最琐碎的应用程序外,它都是一系列语句。在每条语句之后提交会导致不一致、不可恢复和(可能)数据损坏

但是,要回答这个问题:Autocommit在语句级别提交。因此,无法回滚单个成功完成的事务。因此,如果希望将多个DML语句合并到一个事务中,并可能回滚不完整的工作单元,则需要将这些语句分组到PL/SQL块中

这里我们有一个PL/SQL块,它在单个语句中插入一些记录

begin
    insert into t23 (id) values (1);
    insert into t23 (id) values (2);
    insert into t23 (id) values (3);
    insert into t23 (id) values (4);
    insert into t23 (id) values (1);
exception
    when dup_val_on_index then
        rollback;
        raise;
end;
/
如果我们在一个有自动提交功能的客户机上运行这个块,它将插入零条记录。Autocommit在执行级别上运行,在本例中,执行级别是块:要么全部成功并提交,要么失败且未提交。因此,第五次插入未能通过主键验证将触发前四次插入的回滚

注意,即使在异常处理程序中没有显式回滚,也会回滚四个插入。阻止失败,事务未提交


那么这个选项是关于什么的呢?:
tools-preferences-database-advance-autocommit复选框


这是来自客户端IDE(Oracle SQL Developer?)的菜单路径。自动提交是一个客户端选项,它在客户端执行每个语句后都会发出提交。

Oracle本身没有自动提交,请调整工具并使用begin exception end;:

请同时阅读-并非所有人都知道DDL命令隐式提交-所有内容 在提交任何DDL语句之前完成:

Oracle本身没有自动提交,请调整您的工具并使用begin exception end;:

请同时阅读-并非所有人都知道DDL命令隐式提交-所有内容 在提交任何DDL语句之前完成:

您不能在PL/SQLyes中关闭自动提交是的,您可以,只需转到工具-首选项-数据库-高级,您就可以在那里选中自动提交复选框。这不是“PL/SQL”-这是您正在使用的SQL客户端中的一些自动提交设置(另外,它可能只影响SQL,而不是PL/SQL)它影响DML语句,因此,它正在做这项工作一个演示问题的PL/SQL代码示例将非常有用。您不能在PL/SQL中关闭自动提交是的,您可以,只需转到工具-首选项-数据库-高级,然后在那里您就有了自动提交复选框。这不是“PL/SQL”-这是您正在使用的SQL客户端中的一些自动提交设置(另外,它可能只影响SQL,而不影响PL/SQL)它会影响DML语句,所以它正在做这个工作。一个演示问题的PL/SQL代码的例子会很有帮助。我知道整个程序块都会因为这第五行而失败,这就是事务点,不是吗?这就是为什么我问我的question@johndoe-唉,那么你的问题不清楚。我以为你在问ab当您的客户端在自动提交模式下运行时,回滚是如何工作的。@J.Doe所以您的问题是如何在PL/SQL中跨自动提交回滚