DB2事务回滚与错误检测 | AI生成和翻译

Home 2025.11

当 DB2 因系统错误执行回滚时

IBM DB2 在遇到危及数据完整性的严重系统错误时会自动回滚事务。常见场景包括:

如何检测详细错误信息

1. 主要错误检测机制

SQLCODE 和 SQLSTATE 每条 SQL 语句执行后,DB2 会设置这些变量:

-- 在语句执行后立即检查
IF SQLCODE < 0 THEN
    -- 发生错误
    ROLLBACK;
END IF;

SQLSTATE 分类代码专门标识错误类型:

GET DIAGNOSTICS 语句 在 SQL PL 存储过程中获取详细错误信息:

DECLARE v_sqlcode INTEGER;
DECLARE v_sqlstate CHAR(5);
DECLARE v_sqlmessage VARCHAR(256);

GET DIAGNOSTICS CONDITION 1
    v_sqlcode = DB2_RETURNED_SQLCODE,
    v_sqlstate = RETURNED_SQLSTATE,
    v_sqlmessage = MESSAGE_TEXT;

2. 命令行错误检测

通过 db2 命令行执行脚本时,检查退出代码:

推荐的脚本模式

db2 -l migration.log +c -stf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
    tail -10 migration.log  # 查看详细错误
else
    db2 commit
fi

3. 存储过程错误处理

在 SQL PL 中使用声明的处理器进行全面的错误检测:

CREATE PROCEDURE my_procedure()
BEGIN
    DECLARE v_sqlcode INTEGER DEFAULT 0;
    DECLARE v_sqlstate CHAR(5) DEFAULT '00000';
    DECLARE v_error_message VARCHAR(256);
    
    -- 为任何异常声明退出处理器
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1
            v_sqlcode = DB2_RETURNED_SQLCODE,
            v_sqlstate = RETURNED_SQLSTATE,
            v_error_message = MESSAGE_TEXT;
            
        -- 将错误详情记录到表或文件
        INSERT INTO error_log (sqlcode, sqlstate, message, timestamp)
        VALUES (v_sqlcode, v_sqlstate, v_error_message, CURRENT_TIMESTAMP);
        
        ROLLBACK;
    END;
    
    -- 您的事务逻辑在此
    UPDATE employee SET salary = salary + 1000 WHERE job = 'MANAGER';
    INSERT INTO audit_log VALUES (CURRENT_TIMESTAMP, 'Salary update');
    
    COMMIT;
END

4. DB2 诊断日志文件

对于系统级错误,始终检查:

错误检测最佳实践

  1. 关键操作后立即检查 SQLCODE/SQLSTATE
  2. 在存储过程中使用 GET DIAGNOSTICS 获取丰富的错误上下文
  3. 实施事务回滚百分比监控 - 超过 1% 即需调查
  4. 启用脚本执行的命令选项
    db2 +c -s -v -l error.log -f script.sql
    

    其中 +c 禁用自动提交,-s 在错误时停止

  5. 在复杂事务中使用保存点 进行部分回滚
  6. 回滚前将错误详情记录 到持久化表中以保留诊断信息

需要监控的关键系统错误 SQLSTATE

SQLSTATE 描述 应对措施
58004 系统错误(多种原因) 立即检查 db2diag.log
58008 通信错误 验证网络/连接性
HY000 通用驱动程序错误 检查 ODBC/JDBC 驱动程序日志
40001 死锁/超时 使用退避策略重试事务

对于生产环境,监控工具应在 SQLCODE < 058 类 SQLSTATE 时发出警报,以便在系统级问题级联之前主动检测到它们。


Back

moonshotai/kimi-k2-thinking

Donate