首批通过分布式安全可靠测评,为关键业务系统打造
事务回滚
更新时间:2026-04-07 20:57:19
当出现以下报错时,表示出现了事务回滚。
| 对外错误码 | 内部错误码 | 信息展示 |
|---|---|---|
| 6002 | -6224 | transaction need rollback |
| 6002 | -6223 | Transaction exiting |
| 6002 | -6211 | Transaction is killed |
| 6002 | -6213 | Transaction context does not exist |
事务回滚不一定是异常,有几类情况会导致事务回滚,例如事务超时,参与者切主等。
以下情况会导致切主的发生:
- 运维场景:switch replica leader、变更 primary zone、remove server、stop server
- 内部调度场景:迁移 Unit、副本下线、在 primary zone 上补副本
- 内部异常场景:异常切主
由 Root Service 触发的切主,系统会给现存的活跃事务预留一定时间,等待其执行完成,同时不允许开启新事务。时间到期后,将所有依然活跃的事务迁移到新 Leader。然后切主,新 Leader 继续提供服务。
存在一些场景会导致切主杀事务的发生:
- 切主不是由 RootService 触发,例如异常切主
- 大事务场景
- 切主触发迁移事务到新 Leader 的过程中,语句尚未执行结束
当出现事务回滚的报错时,可以通过视图 DBA_OB_SERVER_EVENT_HISTORY 确认是否发生了切主。如下示例展示了一个由 switch replica leader 命令触发的切主流程。
查询切主前的日志流 Leader 分布。
obclient> select TENANT_ID,LS_ID,SVR_IP,SVR_PORT,ROLE,PAXOS_MEMBER_LIST from GV$OB_LOG_STAT where tenant_id=1 and ls_id=1; +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | PAXOS_MEMBER_LIST | +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ | 1 | 1 | xx.xx.xx.158| 2882 | FOLLOWER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | | 1 | 1 | xx.xx.xx.43 | 2882 | FOLLOWER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | | 1 | 1 | xx.xx.xx.106| 2882 | LEADER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ 3 rows in set (0.01 sec)执行切主动作。
obclient> alter system switch replica leader ls=1 server='xx.xx.xx.158:2882' tenant='sys'; Query OK, 0 rows affected (0.01 sec)查询日志流选主事件。
obclient> SELECT VALUE4 HAPPENED_TIME,svr_ip,VALUE1 TENANT_ID,VALUE2 LS_ID,event,name3,value3 FROM DBA_OB_SERVER_EVENT_HISTORY WHERE module="ELECTION"; +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ | HAPPENED_TIME | svr_ip | TENANT_ID | LS_ID | event | name3 | value3 | +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ | 2023-06-12 23:27:23.291335 | xx.xx.xx.106| 1 | 1 | prepare change leader | INFO | leader prepare to change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882", reason : MANUAL LEADER | | 2023-06-12 23:27:23.294363 | xx.xx.xx.158| 1 | 1 | change leader to takeover | INFO | new leader takeover : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.318691 | xx.xx.xx.43 | 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.292954 | xx.xx.xx.106| 1 | 1 | change leader to revoke | INFO | old leader revoke : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.541978 | xx.xx.xx.158| 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.542136 | xx.xx.xx.106| 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ 6 rows in set (0.02 sec)