原文链接: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 12月 31日
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 12月 31日
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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。