ORA-02046: distributed transaction already begun
Cause: internal error or error in external transaction manager. A server session received a begin_tran RPC before finishing with a previous distributed tran.
Action: None
ORA-02046: distributed transaction already begun 是由于当前的会话试图开启一个已经开启的分布式事务,而引起的。
官方解释
这是一个ORACLE数据库服务器报出的错误,意思是数据库会话因为以下原因而尝试重复开始一个已经开启了的分布式事务:
1. 该会话未提交先前开启的分布式事务。
2. 由于网络问题,该会话未能成功关闭先前开启的分布式事务。
常见案例
1. 在相同的事务上,受影响的会话企图多次开始一个还未提交或回滚的分布式事务;
2. 在一个分布式事务中,分布的事务失败导致在提交步骤提交不成功,因此每次调用时都尝试重复开始,但是这样做会受到ORA-02046错误。
正常处理方法及步骤
1. 关闭所有处于“已激活”状态的会话;
2. 手动执行提交或回滚语句,关闭分布式事务;
3. 如果错误仍然存在,可以尝试直接在DBA_2PC_PENDING的视图上执行分布式事务的提交或回滚;
4. 如果问题仍然存在,可以检查当前的rollback segment使用情况,确保充分的rollback segment可用,如果rollback segment不足,重新调整大小,或增加新的rollback segment;
5. 如果问题仍然存在,可以重置表空间或数据库,重新设置分布式事务功能;
6. 最后,可以尝试针对对应存储及对应表收集SQL跟踪日志,以进一步分析故障原因,并定位解决方案。