1. during enlist resource, if there is XAException arisen, we should mark status as rollback only because the enlist resource failed.
2. during commit, convert XAER_RMERR, XAER_PROTO & XAER_INVAL to system exceptions.
3. if system exceptions arisen during internal prepare, we should roll back the resource(s).
4. during rollback, if XA_RBROLLBACK, XAER_RMERR,XAER_NOTA & XAER_RMFAIL arisen, we expect the transaction to be rolled back eventually thus don't throw anything. During commit, we throw rollback exceptions for these.
5. if XAER_NOTA arisen from forget, means the resource already forgot the transaction, thus we don't throw any exception.