事务块中出现语句错误,不是所有数据库都跟 Oracle 表现一样!

数据库 其他数据库
失败的 SQL 语句只会导致丢失它自己执行的任何工作;它不会导致在当前事务中丢失之前的任何工作。如果该语句是 DDL 语句,则不会撤消紧接在它前面的隐式提交。

PostgreSQL - ERROR: current transaction is aborted

通常,您制造的任何错误都会引发异常,并导致当前事务被标记为中止。这是理智和预期的行为,但如果它发生在您运行大型事务并输入了错误内容时,这可能会非常的烦人!此时,您唯一能做的就是回滚事务并丢弃所有工作。

当您在 PostgreSQL 中遇到错误时,事务是无法继续的。例如:

DROP TABLEIFEXISTS demo;

STARTTRANSACTION;
CREATETABLE demo(n, t)ASSELECT1 n,current_timestamp t;
ALTERTABLE demo ADDUNIQUE(n);

SELECT*FROM demo;
 n |               t
---+-------------------------------
1|2021-06-2618:15:07.207671+08
(1row)

INSERTINTO demo VALUES(2,current_timestamp);
SELECT*FROM demo;
 n |               t
---+-------------------------------
1|2021-06-2618:15:07.207671+08
2|2021-06-2618:15:07.207671+08
(2rows)

INSERTINTO demo VALUES(1,current_timestamp);
ERROR:  duplicate key value violates uniqueconstraint"demo_n_key"
DETAIL:Key(n)=(1) already exists.

SELECT*FROM demo;
ERROR:currenttransactionis aborted, commands ignored untilendoftransaction block

ROLLBACK;

SELECT*FROM demo;
ERROR:  relation "demo" does not exist
LINE1:SELECT*FROM demo;

在这里我们进行了回滚。但其实也可以提交来终止事务,但它无论如何都会回滚:

COMMIT;

SELECT * FROM demo;
ERROR:  relation "demo" does not exist
LINE 1: SELECT * FROM demo;

Oracle 语句级回滚

如果在执行过程中的任何时候,SQL 语句发生错误,则该语句的所有更改都将回滚。回滚的效果就好像该语句从未执行过一样。这是一种语句级的回滚。

在 SQL 语句执行过程中发生的错误会导致语句级回滚。(此类错误的一个示例是,尝试在主键中插入重复值。在 SQL 语句解析过程中发生的错误(如语法错误)尚未执行,因此不会导致语句级回滚。涉及死锁(争用相同数据)的单个 SQL 语句也可能导致语句级回滚。

失败的 SQL 语句只会导致丢失它自己执行的任何工作;它不会导致在当前事务中丢失之前的任何工作。如果该语句是 DDL 语句,则不会撤消紧接在它前面的隐式提交。

在 Oracle 中,在一次用户调用中有一个语句失败时,将会回滚该用户调用所做的修改,但不会回滚之前的修改。事务还可以继续(如重试,或执行替代的更改),例如:

CREATE TABLE DEMO ASSELECT1 n,current_timestamp t FROM dual;
ALTERTABLE DEMO ADDUNIQUE(n);

SELECT*FROM DEMO;
         N T
---------- -----------------------------------
102-AUG-2111.04.16.507292 PM +00:00

INSERTINTO DEMO VALUES(2,current_timestamp);

SELECT*FROM DEMO;
         N T
---------- -----------------------------------
102-AUG-2111.04.16.507292 PM +00:00
202-AUG-2111.04.16.601105 PM +00:00

INSERTINTO DEMO VALUES(1,current_timestamp);
ERROR at line 1:
ORA-00001:uniqueconstraint(DEMO.SYS_C007847) violated

SELECT*FROM DEMO;
         N T
---------- -----------------------------------
102-AUG-2111.04.16.507292 PM +00:00
202-AUG-2111.04.16.601105 PM +00:00
责任编辑:武晓燕 来源: 红石PG
相关推荐

2010-05-06 10:01:25

Oracle数据库

2010-09-07 11:09:33

SQL语句

2018-01-24 19:59:03

数据库Oracle坏块

2010-05-04 10:51:53

Oracle数据库

2011-08-09 16:15:23

OracleDDL语句DML语句

2024-06-26 07:50:08

OraclePostgreSQLDO语句

2010-04-14 17:29:33

Oracle数据库

2011-08-12 13:33:31

Oracle数据库自治事务

2009-12-11 13:43:55

PHP获得所有数据库

2009-10-23 15:30:17

Oracle表空间恢复

2010-09-03 13:40:24

SQL删除

2010-04-15 08:57:29

Oracle数据库

2021-04-29 22:38:04

Python数据库SQL

2021-04-30 15:34:23

Python 开发编程语言

2012-12-31 10:25:52

大数据

2010-08-12 15:31:07

DB2数据库

2010-09-07 15:20:58

SQL语句事务

2011-06-15 10:10:17

Oracle11g

2019-11-20 09:10:12

开源技术 数据

2010-04-02 12:23:30

Oracle数据库
点赞
收藏

51CTO技术栈公众号