在 SAP HANA 数据库开发中,有一种非常棘手的情况。业务操作失败后,系统不仅需要撤销已经执行的数据修改,还必须把失败原因永久记录下来,供后续排查问题。假设我们正在开发一套基于 SAP S/4HANA 的销售订单处理系统。用户提交订单后,后台存储过程需要完成订单创建、库存检查、信用额度校验等操作。一旦发现库存不足,或者数据库执行过程中出现异常,整个业务事务就应该回滚,不能留下不完整的订单数据。可问题随之而来。我们希望在数据库中记录订单处理失败的时间、业务参数、错误代码以及错误信息。如果日志记录与订单处理处于同一个数据库事务,那么业务事务回滚时,刚刚写入的错误日志也会被撤销。这就出现了一个看似矛盾的需求。业务数据必须回滚,错误日志却必须保留。如果把日志写入操作放到普通的异常处理程序中,并不能解决这个问题,因为异常处理程序默认仍然处于原来的事务上下文中。SAP HANA SQLScript 提供的Autonomous Transaction,也就是自治事务,正是为这类需求设计的。它允许我们在一个正在执行的存储过程中,开启一个具有独立事务生命周期的代码块。该代码块中的数据修改可以独立提交,即使外层业务事务最终失败并回滚,已经提交的自治事务也不会因此被撤销。这种机制特别适合数据库异常审计、关键操作留痕、独立业务事件记录等场景。不过,事务独立并不代表可以随意访问所有业务数据,也不代表自治事务能够绕过数据库锁、数据可见性限制和事务一致性规则。要在生产系统中安全使用这项能力,需要把它与普通事务、异常处理、显式提交、嵌套调用以及锁管理之间的关系真正理解清楚。
