/* * __wt_txn_rollback -- * Roll back the current transaction. */ int __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[]) { WT_TXN *txn; wt_txnid_t **m; WT_REF **rp; u_int i; WT_UNUSED(cfg); txn = &session->txn; if (!F_ISSET(txn, TXN_RUNNING)) WT_RET_MSG(session, EINVAL, "No transaction is active"); /* Rollback updates. */ for (i = 0, m = txn->mod; i < txn->mod_count; i++, m++) **m = WT_TXN_ABORTED; /* Rollback fast deletes. */ for (i = 0, rp = txn->modref; i < txn->modref_count; i++, rp++) __wt_tree_walk_delete_rollback(*rp); __wt_txn_release(session); return (0); }
/* * __wt_txn_rollback -- * Roll back the current transaction. */ int __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[]) { WT_DECL_RET; WT_TXN *txn; WT_TXN_OP *op; u_int i; WT_UNUSED(cfg); txn = &session->txn; if (!F_ISSET(txn, TXN_RUNNING)) WT_RET_MSG(session, EINVAL, "No transaction is active"); /* Rollback notification. */ if (txn->notify != NULL) WT_TRET(txn->notify->notify(txn->notify, (WT_SESSION *)session, txn->id, 0)); /* Rollback updates. */ for (i = 0, op = txn->mod; i < txn->mod_count; i++, op++) { switch (op->type) { case TXN_OP_BASIC: case TXN_OP_INMEM: op->u.op.upd->txnid = WT_TXN_ABORTED; break; case TXN_OP_REF: __wt_tree_walk_delete_rollback(op->u.ref); break; case TXN_OP_TRUNCATE_COL: case TXN_OP_TRUNCATE_ROW: /* * Nothing to do: these operations are only logged for * recovery. The in-memory changes will be rolled back * with a combination of TXN_OP_REF and TXN_OP_INMEM * operations. */ break; } /* Free any memory allocated for the operation. */ __wt_txn_op_free(session, op); } __wt_txn_release(session); return (ret); }