pmem::obj::transaction::manual Class Reference

C++ manual scope transaction class. More...

`#include <libpmemobj++/transaction.hpp>`

## Public Member Functions

template<typename... L>
| manual (obj::pool_base &pop, L &... locks)
| RAII constructor with pmem resident locks. More...
| ~manual () noexcept
| Destructor. More...
| manual (const manual &p)=delete
| Deleted copy constructor.
| manual (const manual &&p)=delete
| Deleted move constructor.
manual & | operator= (const manual &p)=delete
| Deleted assignment operator.
manual & | operator= (manual &&p)=delete
| Deleted move assignment operator.

## Detailed Description

C++ manual scope transaction class.

This class is one of pmemobj transaction handlers. All operations between creating and destroying the transaction object are treated as performed in a transaction block and can be rolled back. The manual transaction has to be committed explicitly otherwise it will abort.

The locks are held for the entire duration of the transaction. They are released at the end of the scope, so within the `catch` block, they are already unlocked. If the cleanup action requires access to data within a critical section, the locks have to be manually acquired once again.

The typical usage example would be:

#include <libpmemobj++/make_persistent.hpp>
#include <libpmemobj++/mutex.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pext.hpp>
#include <libpmemobj++/pool.hpp>
#include <libpmemobj++/shared_mutex.hpp>
#include <libpmemobj++/transaction.hpp>
using namespace pmem::obj;
int
manual_tx_example()
{
// pool root structure
struct root {
mutex pmutex;
shared_mutex shared_pmutex;
p<int> count;
persistent_ptr<root> another_root;
};
// create a pmemobj pool
auto pop = pool<root>::create("poolfile", "layout", PMEMOBJ_MIN_POOL);
auto proot = pop.get_root();
try {
transaction::manual tx(pop, proot->pmutex,
proot->shared_pmutex);
// atomically allocate objects
proot->another_root = make_persistent<root>();
// atomically modify objects
proot->count++;
// It's necessary to commit the transaction manually and
// it has to be the last operation in the transaction.
transaction::commit();
} catch (pmem::transaction_error &te) {
// an internal transaction error occurred, tx aborted
// reacquire locks if necessary
} catch (...) {
// some other exception thrown, tx aborted
// reacquire locks if necessary
}
// In complex cases with library calls, remember to check the status of
// the previous transaction.
return transaction::get_last_tx_error();
}

## Constructor & Destructor Documentation

## manual()

template<typename... L>

pmem::obj::transaction::manual::manual | ( | obj::pool_base & | pop,
|  | L &... | locks
| ) |  |

inline

RAII constructor with pmem resident locks.

Start pmemobj transaction and add list of locks to new transaction. The list of locks may be empty.

Parameters

  [in,out] | pop | pool object.
  [in,out] | locks | locks of obj::mutex or obj::shared_mutex type.

Exceptions

  pmem::transaction_error | when pmemobj_tx_begin function or locks adding failed.

## ~manual()

pmem::obj::transaction::manual::~manual | ( |  | ) |

inline noexcept

Destructor.

End pmemobj transaction. If the transaction has not been committed before object destruction, an abort will be issued.

The documentation for this class was generated from the following file:

- pmdk-1.4.1/src/include/libpmemobj++/transaction.hpp