事务是数据库操作的逻辑工作单元,需满足ACID属性(原子性、一致性、隔离性、持久性)。Informix通过事务机制确保数据操作的可靠性——要么全部成功提交,要么全部回滚撤销。
使用BEGIN WORK(或START TRANSACTION)语句显式开启事务,标志着逻辑工作单元的开始。示例如下:
BEGIN WORK;
或在Shell脚本中通过dbaccess工具执行:
dbaccess your_database <<EOF
BEGIN WORK;
EOF
在事务内执行增删改操作(INSERT/UPDATE/DELETE),这些操作会暂存于事务缓冲区,未永久写入数据库。示例如下:
INSERT INTO employees (id, name, department) VALUES (1, 'John Doe', 'Sales');
UPDATE employees SET department = 'Marketing' WHERE id = 2;
DELETE FROM employees WHERE id = 3;
COMMIT WORK(或COMMIT)将事务变更永久保存至数据库。示例如下:COMMIT WORK;
ROLLBACK WORK(或ROLLBACK)撤销事务内所有未提交的变更。示例如下:ROLLBACK WORK;
在Shell脚本中可通过条件判断实现错误回滚:dbaccess your_database <<EOF
BEGIN WORK;
INSERT INTO employees (id, name) VALUES (1, 'John');
-- 模拟错误(如重复主键)
INSERT INTO employees (id, name) VALUES (1, 'Jane');
-- 若出错则回滚
ROLLBACK;
EOF
保存点是事务内的标记点,允许部分回滚而不撤销整个事务。语法如下:
SAVEPOINT savepoint_name; -- 设置保存点
-- 执行部分操作
ROLLBACK TO SAVEPOINT savepoint_name; -- 回滚至保存点
COMMIT; -- 提交剩余操作
示例如下:
BEGIN WORK;
INSERT INTO employees (id, name) VALUES (1, 'Alice');
SAVEPOINT sp1;
UPDATE employees SET department = 'HR' WHERE id = 1;
-- 若更新失败,回滚至sp1
ROLLBACK TO SAVEPOINT sp1;
COMMIT;
通过存储过程封装事务逻辑,实现自动错误处理(如异常时自动回滚)。示例如下:
CREATE PROCEDURE update_employee_salary(emp_id INT, new_salary DECIMAL(10,2))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION -- 定义异常处理器
BEGIN
ROLLBACK; -- 发生异常时回滚
RETURN -1; -- 返回错误码
END;
START TRANSACTION; -- 开启事务
UPDATE employees SET salary = new_salary WHERE id = emp_id;
COMMIT; -- 提交事务
RETURN 0; -- 返回成功码
END;
调用存储过程:
EXECUTE PROCEDURE update_employee_salary(1, 5000.00);
务必在事务中捕获异常(如通过存储过程的EXIT HANDLER或Shell脚本的条件判断),避免因未回滚导致数据不一致。
Informix通过锁机制保证事务隔离性(如行锁、表锁)。需注意:
onstat -k命令查看锁等待),及时终止阻塞进程(onmode -z sid)。ontape -a)并监控空间使用(onstat -l);ALARmprogram参数)提升性能。