在Oracle中开始事务-在自动提交中回滚
我正在从SQL Server迁移到Oracle,我发现在Oracle中,默认情况下自动提交是禁用的,但我的问题是,当启用自动提交时,如何回滚事务?SQL Server中有在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
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中跨自动提交回滚