diff --git a/extension b/extension index 7d7f90fdb..c0b7d473a 160000 --- a/extension +++ b/extension @@ -1 +1 @@ -Subproject commit 7d7f90fdbb562965407e7c29a8ae5312d09b5812 +Subproject commit c0b7d473ad3d5932d43f563576ea0d1487034e98 diff --git a/src/include/transaction/transaction.h b/src/include/transaction/transaction.h index e8ec8c139..d8b02046c 100644 --- a/src/include/transaction/transaction.h +++ b/src/include/transaction/transaction.h @@ -1,7 +1,9 @@ #pragma once #include +#include #include +#include #include "common/types/types.h" @@ -119,6 +121,8 @@ class LBUG_API Transaction { void writeCommitToWAL(storage::WAL* wal, uint64_t& walCommitSequence); void publishCommit(); void rollback(storage::WAL* wal); + void pushCommitCallback(std::function callback); + void pushRollbackCallback(std::function callback); storage::LocalStorage* getLocalStorage() const { return localStorage.get(); } LocalCacheManager& getLocalCacheManager() { return localCacheManager; } @@ -163,6 +167,8 @@ class LBUG_API Transaction { std::unique_ptr undoBuffer; std::unique_ptr localWAL; LocalCacheManager localCacheManager; + std::vector> commitCallbacks; + std::vector> rollbackCallbacks; bool forceCheckpoint; std::atomic hasCatalogChanges; }; diff --git a/src/transaction/transaction.cpp b/src/transaction/transaction.cpp index a98ff33b7..bd0f2257b 100644 --- a/src/transaction/transaction.cpp +++ b/src/transaction/transaction.cpp @@ -93,6 +93,11 @@ void Transaction::publishCommit() { Catalog::Get(*clientContext)->incrementVersion(); hasCatalogChanges = false; } + for (auto& callback : commitCallbacks) { + callback(*this); + } + commitCallbacks.clear(); + rollbackCallbacks.clear(); } void Transaction::rollback(storage::WAL*) { @@ -102,6 +107,19 @@ void Transaction::rollback(storage::WAL*) { undoBuffer->rollback(clientContext); localStorage->rollback(); hasCatalogChanges = false; + for (auto& callback : rollbackCallbacks) { + callback(*this); + } + commitCallbacks.clear(); + rollbackCallbacks.clear(); +} + +void Transaction::pushCommitCallback(std::function callback) { + commitCallbacks.push_back(std::move(callback)); +} + +void Transaction::pushRollbackCallback(std::function callback) { + rollbackCallbacks.push_back(std::move(callback)); } bool Transaction::isUnCommitted(common::table_id_t tableID, common::offset_t nodeOffset) const {