MDBX Containers
Loading...
Searching...
No Matches
Transaction.ipp
Go to the documentation of this file.
1namespace mdbxc {
2
3 inline Transaction::Transaction(TransactionTracker* registry, MDBX_env* env, TransactionMode mode)
4 : m_registry(registry), m_env(env), m_mode(mode) {
5 begin();
6 }
7
9 m_registry->unbind_txn();
10 if (!m_txn) return;
11 mdbx_txn_abort(m_txn);
12 m_txn = nullptr;
13 }
14
15 inline void Transaction::begin() {
16 if (m_started) return;
18 check_mdbx(mdbx_txn_renew(m_txn), "Failed to renew transaction");
19 } else {
20 MDBX_txn_flags_t flags = (m_mode == TransactionMode::READ_ONLY) ? MDBX_TXN_RDONLY : MDBX_TXN_READWRITE;
21 check_mdbx(mdbx_txn_begin(m_env, nullptr, flags, &m_txn), "Failed to begin transaction");
22 }
23 m_registry->bind_txn(m_txn);
24 m_started = true;
25 }
26
27 inline void Transaction::commit() {
28 if (!m_txn || !m_started) throw MdbxException("No active transaction to commit.");
29 try {
30 switch (m_mode) {
32 check_mdbx(mdbx_txn_reset(m_txn), "Failed to reset read-only transaction");
33 break;
35 check_mdbx(mdbx_txn_commit(m_txn), "Failed to commit writable transaction");
36 m_txn = nullptr;
37 m_registry->unbind_txn();
38 break;
39 };
40 m_started = false;
41 } catch (...) {
42 if (m_txn) {
43 mdbx_txn_abort(m_txn);
44 m_txn = nullptr;
45 m_registry->unbind_txn();
46 }
47 m_started = false;
48 throw;
49 }
50 }
51
52 inline void Transaction::rollback() {
53 if (!m_txn || !m_started) throw MdbxException("No active transaction to rollback.");
54 try {
55 switch (m_mode) {
57 check_mdbx(mdbx_txn_reset(m_txn), "Failed to reset read-only transaction");
58 break;
60 check_mdbx(mdbx_txn_abort(m_txn), "Failed to abort writable transaction");
61 m_txn = nullptr;
62 m_registry->unbind_txn();
63 break;
64 };
65 m_started = false;
66 } catch (...) {
67 if (m_txn) {
68 mdbx_txn_abort(m_txn);
69 m_txn = nullptr;
70 m_registry->unbind_txn();
71 }
72 m_started = false;
73 throw;
74 }
75 }
76
77 inline MDBX_txn* Transaction::handle() const noexcept {
78 return m_txn;
79 }
80
81} // namespace mdbxc
Represents a specific exception for MDBX-related errors.
Associates MDBX transactions with threads.
TransactionMode m_mode
Current transaction mode.
MDBX_env * m_env
Pointer to the MDBX environment handle.
Transaction(TransactionTracker *registry, MDBX_env *env, TransactionMode mode)
Constructs a new transaction object.
virtual ~Transaction()
Destructor that safely closes or resets the transaction.
void begin()
Starts the transaction.
TransactionTracker * m_registry
void rollback()
Rolls back the transaction.
void commit()
Commits the transaction.
MDBX_txn * m_txn
MDBX transaction handle.
MDBX_txn * handle() const noexcept
Returns the internal MDBX transaction handle.
void check_mdbx(int rc, const std::string &context)
Throws an MdbxException if MDBX return code indicates an error.
Definition utils.hpp:18
TransactionMode
Specifies the access mode of a transaction.
@ READ_ONLY
Read-only transaction (no write operations allowed).
@ WRITABLE
Writable transaction (allows inserts, updates, deletes).