oracle - 在 Oracle 中开始事务 - 在自动提交中回滚
问题描述
我正在从 SQL Server 迁移到 Oracle。我发现的一件事是默认情况下在 Oracle 中自动提交是禁用的。我的问题是当自动提交打开时我们如何回滚事务?SQL Server里面有Begin tran
语句,Oracle呢?
解决方案
begin tran
在 Oracle中没有等价物。
Oracle 在我们第一次运行某些 DML 时隐式启动事务。事务一直持续到我们发出 COMMIT 或 ROLLBACK。请注意,在 Oracle DDL 命令中,在执行之前和之后发出隐式提交;所以我们不仅不能回滚 CREATE TABLE 语句,我们也不能回滚我们在 CREATE TABLE 语句之前执行的任何 DML 语句。
在我的书中,自动提交是一种反模式:事务是一个工作单元,除了最微不足道的应用程序之外,它实际上是一系列语句。在每个语句之后提交会导致不一致、不可恢复和(潜在的)数据损坏。
但是,要回答这个问题:自动提交在语句级别提交。所以没有办法回滚单个成功完成的事务。因此,如果您希望将多个 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 checkbox
这是来自客户端 IDE(Oracle SQL Developer?)的菜单路径。AUTOCOMMIT 是一个客户端选项,它在客户端执行的每个语句之后发出一个提交。
推荐阅读
- c++ - Avoid warnings from system libraries/includes using CMake
- google-apps-script - 从现有草稿 [GmailApp] [Apps 脚本] 的 htmlBody 嵌入内嵌图像时会中断
- sql - 同一对象中的 SQL Server 根 + FOR JSON 路径
- r - R call_geolocator_latlon function returns NA
- python - Can't convert Pillow Image to numpy array or to RGB mode
- pandas - 熊猫仅在有意义时重新采样
- android - Battery usage settings, allow app running in background programmatically
- python - Ensure that view shows scrollbar and adapts
- html - 当导航栏在悬停/滚动时更改状态时更改引导导航栏徽标图像
- android - 发布应用程序崩溃致命异常:create_react_context (React Native)