Skip to content
This repository has been archived by the owner on Jun 12, 2020. It is now read-only.

Savepoints

Rik Prohaska edited this page Mar 3, 2015 · 10 revisions

TokuDB uses a stack of nested transactions to implement savepoints. For each savepoint defined in a transaction, TokuDB creates a new child transaction of the transaction on the top of the stack and pushes the new transaction onto the stack. All transaction operations after a savepoint uses the transaction associated with the savepoint. A rollback to savepoint will pop the stack until the savepoint is found and abort the transaction associated with the savepoint.

Savepoint Transaction Data Structures

Suppose that there are several savepoints defined in a transaction labelled S0, S1, S2, ... SN. The TokuDB transaction stack that corresponds to these savepoints is T0, T1, T2, ... TN, where T(i) is a child transaction of T(i-1). This data structure efficiently supports savepoint rollback since an abort of the savepoint's transaction will abort all of its children.

MySQL will allocate a tokudb_savepoint_info struct for each savepoint. This struct maps a savepoint to a TokuDB transaction pointer. TokuDB gets passed a tokudb_savepoint_info struct in each of the following three handlerton methods.

The tokudb_savepoint Handlerton Method

The tokudb_savepoint handlerton method is called when a savepoint is being created. This method creates a child transaction of trx->sp_level and saves the new child transaction in trx->sp_level. Subsequent storage engine operations will use the new child transaction since they pick up the transaction pointer from trx->sp_level. In addition, this method stores the new child transaction in the tokudb_savepoint_info object that MySQL passed to this method.

The tokudb_rollback_savepoint Handlerton Method

The tokudb_rollback_savepoint handlerton method is called when a transaction is being rolled back to this savepoint. This method uses the tokudb_savepoint_info object to find the transaction associated with the savepoint. This child transaction is aborted. The top of the transaction stack is set to the parent of this child transaction and a new savepoint is created.

The tokudb_release_savepoint Handlerton Method

The tokudb_release_savepoint handlerton method is called when a savepoint is being released from the set of named savepoints. If the transaction associated with the savepoint has no children, then that transaction is committed and its parent transaction inherits all of its changes. If the transaction associated with the savepoint does have a child, then that transaction is ignored (neither committed or aborted).

Savepoint Limits

Since TokuFT only allows a nested transaction depth of about 253, a TokuDB transaction is similarly limited in the number of savepoints that it can define.

Clone this wiki locally