南大通用GBase 8s 之 DBACCNOIGN 环境变量简介

0 阅读3分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

使用 DBACCNOIGN 环境变量,可以指定在发生指定的错误时 dbaccess的行为。

  • 未设置 DBACCNOIGN(默认行为):错误发生前已执行的 SQL 语句会被提交。
  • 设置 DBACCNOIGN=1:发生错误时,退出 dbaccess并自动回滚整个未完成的事务。

注:为保证操作连续性,建议不设置此环境变量生效。

实例演示

示例1、未设置 DBACCNOIGN

1、准备数据。

drop table receipts;
drop table customer;
create table receipts(name varchar(20),n1 int);
CREATE TABLE customer (
   cust_id      SERIAL PRIMARY KEY,
   cust_name    VARCHAR(50) NOT NULL,
   balance      DECIMAL(12,2) DEFAULT 0.00,
   status       CHAR(1) DEFAULT 'A',
   create_date  DATE,
   modify_date  DATETIME YEAR TO SECOND
);
INSERT INTO customer (cust_name, balance, create_date, status)
VALUES ('张三', 5000.00, TODAY, 'A');
INSERT INTO customer (cust_name, balance, status) VALUES  ('李四', 3000.00, 'A'), ('王五', 8000.00, 'A'),('赵六', 1500.00, 'I');
---查询
> select * from receipts;

name                          n1

No rows found.
> select * from customer;

cust_id      1
cust_name    张三
balance      5000.00
status       A
create_date  2025 1231日
modify_date
cust_id      2
cust_name    李四
balance      3000.00
status       A
create_date
modify_date
cust_id      3
cust_name    王五
balance      8000.00
status       A
create_date
modify_date
cust_id      4
cust_name    赵六
balance      1500.00
status       I
create_date
modify_date
4 row(s) retrieved.

2、执行以下语句,在事务中进行插入、更新操作。

BEGIN WORK;
INSERT INTO receipts VALUES ('cust1', 10);
INSERT INTO receipt VALUES ('cust1', 20);
INSERT INTO receipts VALUES ('cust1', 30);
UPDATE customer  SET status =   'B';   
COMMIT WORK;

3、查询表数据,如果未在环境中设置 DBACCNOIGN,会将两条记录插入到 receipts 表中,并更新 customer 表的status 字段。

> select * from customer;

cust_id      1
cust_name    张三
balance      5000.00
status       B
create_date  2025 1231日
modify_date
cust_id      2
cust_name    李四
balance      3000.00
status       B
create_date
modify_date
cust_id      3
cust_name    王五
balance      8000.00
status       B
create_date
modify_date
cust_id      4
cust_name    赵六
balance      1500.00
status       B
create_date
modify_date
4 row(s) retrieved.
> select * from receipts;

name                          n1
cust1                         10
cust1                         30
2 row(s) retrieved.

示例2 设置 export DBACCNOIGN=1 

1、执行以下语句,重新准备数据

dbaccess testdb -
drop table receipts;
drop table customer;
create table receipts(name varchar(20),n1 int);
CREATE TABLE customer (
   cust_id      SERIAL PRIMARY KEY,
   cust_name    VARCHAR(50) NOT NULL,
   balance      DECIMAL(12,2) DEFAULT 0.00,
   status       CHAR(1) DEFAULT 'A',
   create_date  DATE,
   modify_date  DATETIME YEAR TO SECOND
);
INSERT INTO customer (cust_name, balance, create_date, status)
VALUES ('张三', 5000.00, TODAY, 'A');
INSERT INTO customer (cust_name, balance, status) VALUES  ('李四', 3000.00, 'A'), ('王五', 8000.00, 'A'),('赵六', 1500.00, 'I');
    
select * from customer;
select * from receipts;

2、执行以下语句,在事务中进行插入、更新操作

BEGIN WORK;
INSERT INTO receipts VALUES ('cust1', 10);
INSERT INTO receipt VALUES ('cust1', 20);
INSERT INTO receipts VALUES ('cust1', 30);
UPDATE customer  SET status =   'B';   
COMMIT WORK;

 

如果将 DBACCNOIGN 设置为 1,在执行第二条语句(表名拼写错误:receipt 表不存在)时,会直接报错。并退出dbaccess会话。

 

3、重新进入库,查看receipt 表没有数据,之前的insert 被回滚 :

设置  DBACCNOIGN 环境变量后,如执行语句有错误,它会直接退出会话。所以不建议设置DBACCNOIGN 环境变量。

以上可见,GBase 8s 的DBACCNOIGN  环境变量 ,未设置该变量时,错误发生前已执行的 SQL 语句会被提交;而设置  DBACCNOIGN=1  时,发生错误会自动回滚整个未完成的事务。根据实际需求选择是否设置此变量,可以更好地控制事务的行为,确保数据的一致性和完整性。

如果在实际应用中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持!

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。