结论

PG的是事务和ORACLE的事务是不一样的

在ORACLE事务中,有失败是可以继续执行的,且事务提交后,只有失败的不可见(成功的可见)

在PG事务中,有失败,立即中止,且前面成功的,也会回滚

报错:current transaction is aborted, commands ignored until end of transaction block


原因

oracle具有子事务功能,orale的子事务是指一个大事务可以包含多个小事务,而每个小事务可以单独提交或者回滚,同时也支持跟随父事务进行提交或回滚。其实现原理为嵌套事务结合保存点来实现的。

在Oracle数据库中执行第一条数据操纵语言(DML)语句(如INSERT、UPDATE、DELETE)时,Oracle会自动隐式地开启一个新的事务。这意味着,事务的开启是自动进行的,用户无需进行额外的操作。


PG
MogDB=# \c testdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "testdb" as user "sysomm".
testdb=# create table t_test_trans(var varchar(2),fixed char(2));
CREATE TABLE
testdb=# begin;
BEGIN
testdb=# insert into t_test_trans values('1','1');
INSERT 0 1
testdb=# insert into t_test_trans values('2','2');
INSERT 0 1
testdb=# insert into t_test_trans values('测试3','测试3');
ERROR:  value too long for type character varying(2)
CONTEXT:  referenced column: var
testdb=# insert into t_test_trans values('4','4');
ERROR:  current transaction is aborted, commands ignored until end of transaction block, firstChar[Q]
testdb=# commit;
ROLLBACK
testdb=# select * from t_test_trans;
 var | fixed 
-----+-------
(0 rows)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
ORACLE
create table t_test_trans(var varchar(2),fixed char(2));

SQL> insert into t_test_trans values('1','1');

1 row created.

SQL> insert into t_test_trans values('2','2');

1 row created.

SQL> insert into t_test_trans values('测试3','测试3');
insert into t_test_trans values('测试3','测试3')
                                *
ERROR at line 1:
ORA-12899: value too large for column "SYS"."T_TEST_TRANS"."VAR" (actual: 10, maximum: 2)


SQL> insert into t_test_trans values('4','4');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t_test_trans;

VAR  FIXE
---- ----
1    1
2    2
4    4
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.