GlobalObjects
|
Klasse um Transaktionen zu gewährleisten. Mehr ...
#include <GloTransactionManager.h>
Klassen | |
class | CommunicatorTransactionStack |
Der Transaktions-Stack eines Client-Kommunikators mit Thread-ID für eine Datenbank. Mehr ... | |
class | TransactionBase |
Basisklasse für TransactionPoint und TransactionStep. Mehr ... | |
class | TransactionPoint |
Objekte dieser Klasse spiegeln einen Transaktions-Start wieder. Mehr ... | |
class | TransactionStep |
Objekte dieser Klasse spiegeln eine Datensatz-Operation wieder. Mehr ... | |
Öffentliche Typen | |
enum | EnStoreDelete { eTRX_STORE , eTRX_DELETE } |
Öffentliche Methoden | |
TransactionManager () | |
virtual | ~TransactionManager () |
int | abortTransaction (std::list< TransactionBase * > &rAbortedTransactionStepList, const TransactionOwner &rCommunicatorWithTreadID) |
void | beginTransaction (const TransactionOwner &rCommunicatorWithTreadID) |
int | commitTransaction (CommunicatorTransactionStack *&prRetVal, const TransactionOwner &rCommunicatorWithTreadID) |
void | deleteAllTransactions (Communicator *pCommunicator) |
int | getActionRecord (Record *&prRetVal, EnStoreDelete &reAction, const TransactionOwner &rCommunicatorWithTreadID, const ObjID &rObjID, const std::string &rsDataPath, bool bInRecursion=false) |
int | getActionRecord (std::shared_ptr< Record > &rRetVal, EnStoreDelete &reAction, const TransactionOwner &rCommunicatorWithTreadID, const ObjID &rObjID, const std::string &rsDataPath, bool bInRecursion=false) |
bool | inTransaction (const TransactionOwner &rCommunicatorWithTreadID) const |
int | setTransactionStep (NUM_PTR &nNewTrxStepAddr, const TransactionOwner &rCommunicatorWithTreadID, EnStoreDelete eAction, Record *pActionRecord) |
Geschützte Methoden | |
TransactionManager::CommunicatorTransactionStack * | getTransactionStack (const TransactionOwner &rCommunicatorWithTreadID) |
void | removeCurrentTransactionStack () |
Private Methoden | |
TransactionManager (const TransactionManager &) | |
TransactionManager & | operator= (const TransactionManager &) |
int | writeTransactionFile (CommunicatorTransactionStack *pTransactionStack) |
Private Attribute | |
std::unordered_map< ObjID, Record *, glo::ObjID::HashFunction > | m_RecursionRecordMap |
std::map< TransactionOwner, CommunicatorTransactionStack *, std::less< TransactionOwner > > | m_TransactionStackMap |
std::map< TransactionOwner, CommunicatorTransactionStack * >::iterator | m_TransactionStackMapIterator |
Klasse um Transaktionen zu gewährleisten.
Objekte dieser Klasse werden vom Manager instanziiert und verwaltet.
Jede Datenbank-Operation (Speichern und Löschen) wird in eine Transaktion gepackt und dem Transaction-Manager übergeben (z.B. Aktion mit den abhängigen Objekten).
Der Verlauf sieht folgendermaßen aus: Der Transaktion-Start (TransactionPoint) wird auf den Transaktions-Stack der anfragenden Instanz gelegt und ein Transaktions-Zähler inkrementiert (beim ersten auf 1 gesetzt).
Dann wird jede Datensatz-Operation (TransactionStep) auf den Transaktions-Stack dazu gelegt . Der TransactionStep beinhaltet den Datensatz, wie er vor der Aktion aussieht, und wie er nach der jeweiligen Aktion aussieht (z.B. gespeichert oder gelöscht).
Wenn ein neuer Transaktion-Start (TransactionPoint) dazukommt, wird dieser auch auf den Transaktions-Stack gelegt und wieder der Transaktions-Zähler inkrementiert.
Wenn ein Transaktions-Abbort (TransactionPoint) kommt, wird der Transaktions-Stack bis zum letzten Transaktions-Start (TransactionPoint) abgebaut und der Transaktions-Zähler dekrementiert. Wenn der erste Transaktions-Start (TransactionPoint) erreicht, wird die Transaktion verworfen.
Wenn ein Transaktion-Commit auf den Transaktions-Stack gelegt wird, wird der Transaktions-Zähler dekrementiert ( wenn 0, wird alles auf dem Transaktions-Stack ausgeführt).
Alle Zugriffe einer anfragenden Instanz auf Daten, welche vom TableReaderInterface vorgenommen werden sollen, gehen erst mal an den TransactionManager. Wenn dieser die erfragten Datensätze vorhält (siehe weiter oben, die Datensätze nach der Aktion, ausgelöst durch die anfragenden Instanz), werden erst mal diese geliefert. Der Rest wird vom TableReaderInterface direkt aus den Tabellen gelesen.
Zukunftsmusik: Ausführen bedeutet, dass ein Transaktionsfile geschrieben wird, welches vom Manager interpretiert wird (alle Aktionen an den TableWriterInterface). Wenn alles vom TableWriterInterface abgearbeitet wurde, wird das Transaktionsfile gelöscht, ansonsten nicht. Wenn der Manager z.B. mit Exception abstürzt, existiert bei einer nicht abgeschlossenen Transaktion das Transaktionsfile noch. Bei einem Neustart wird dann grundsätzlich zuerst versucht, ein vorhandenes Transaktionsfile abzuarbeiten.
glo::TransactionManager::TransactionManager | ( | ) |
Standard-Konstruktor.
|
virtual |
Destruktor.
|
private |
Der Copy-Konstruktor steht nicht zur Verfügung.
int glo::TransactionManager::abortTransaction | ( | std::list< TransactionBase * > & | rAbortedTransactionStepList, |
const TransactionOwner & | rCommunicatorWithTreadID ) |
Es wird aktuelle Transaktion abgebrochen.
[in,out] | rAbortedTransactionStepList | In dieser Liste werden die verworfenen TransactionSteps geliefert (müssen u.a. noch im LockManager freigegeben werden). |
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der die Transaktion abbricht. |
void glo::TransactionManager::beginTransaction | ( | const TransactionOwner & | rCommunicatorWithTreadID | ) |
Beginnt eine neue Transaktion, indem ein neuer TransactionPoint auf den Transaktions-Stack gelegt wird.
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der die Transaktion startet. |
eut::ErrorNException | Bei einem Fehler wird eine Exception geworfen. |
int glo::TransactionManager::commitTransaction | ( | CommunicatorTransactionStack *& | prRetVal, |
const TransactionOwner & | rCommunicatorWithTreadID ) |
Es wird aktuelle Transaktion akzeptiert.
[in,out] | prRetVal | Wenn Rückgabe > 0, dann wird der Transaktions-Stack des Client-Kommunikators zum ausführen der Arbeitsschritte geliefert. |
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der die Transaktion commited. |
void glo::TransactionManager::deleteAllTransactions | ( | Communicator * | pCommunicator | ) |
Es werden alle, ggf. vorhanden, Transaktionen des übergebenen Client-Kommunikator entfernt.
[in] | pCommunicator | Der Client-Kommunikator. |
int glo::TransactionManager::getActionRecord | ( | Record *& | prRetVal, |
EnStoreDelete & | reAction, | ||
const TransactionOwner & | rCommunicatorWithTreadID, | ||
const ObjID & | rObjID, | ||
const std::string & | rsDataPath, | ||
bool | bInRecursion = false ) |
Liefert den letzten im Transaktions-Stack angehängten Datensatz inkl. der Datenbank-Aktion mit der übergebenen Objekt-ID und dem Client-Kommunikator.
[in,out] | prRetVal | Die Datensatz, wenn vorhanden. |
[in,out] | reAction | Die Aktion wie mit dem Datensatz umgegangen werden sollte; speichern oder löschen. |
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten wollte. |
[in] | rObjID | Die Objekt-ID des gewünschten Datensatzes. |
[in] | rsDataPath | Der Datei-Pfad um ggf. die Objekt-IDs aus Dateien zu holen. |
[in] | bInRecursion | Wenn true, dann Aufruf in sich selbst. |
int glo::TransactionManager::getActionRecord | ( | std::shared_ptr< Record > & | rRetVal, |
EnStoreDelete & | reAction, | ||
const TransactionOwner & | rCommunicatorWithTreadID, | ||
const ObjID & | rObjID, | ||
const std::string & | rsDataPath, | ||
bool | bInRecursion = false ) |
Liefert den letzten im Transaktions-Stack angehängten Datensatz inkl. der Datenbank-Aktion mit der übergebenen Objekt-ID und dem Client-Kommunikator.
[in,out] | rRetVal | Die Datensatz, wenn vorhanden. |
[in,out] | reAction | Die Aktion wie mit dem Datensatz umgegangen werden sollte; speichern oder löschen. |
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten wollte. |
[in] | rObjID | Die Objekt-ID des gewünschten Datensatzes. |
[in] | rsDataPath | Der Datei-Pfad um ggf. die Objekt-IDs aus Dateien zu holen. |
[in] | bInRecursion | Wenn true, dann Aufruf in sich selbst. |
|
protected |
Liefert einen Zeiger auf den Transaktions-Stack des übergebenen Client-Kommunikator.
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID. |
bool glo::TransactionManager::inTransaction | ( | const TransactionOwner & | rCommunicatorWithTreadID | ) | const |
Prüft ob übergebener Client-Kommunikator eine Transaktion am Laufen hat.
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID. |
|
private |
Der Zuweisungsoperator steht nicht zur Verfügung.
|
protected |
Entfernt den aktuellen Transaktions-Stack. Wenn eine nachfolgende Transaktion vorhanden ist, wird diese zur aktuellen Transaktion in der m_TransactionStackMap.
int glo::TransactionManager::setTransactionStep | ( | NUM_PTR & | nNewTrxStepAddr, |
const TransactionOwner & | rCommunicatorWithTreadID, | ||
EnStoreDelete | eAction, | ||
Record * | pActionRecord ) |
Generiert einen TransactionStep und legt diesen auf den Transaktions-Stack.
[in,out] | nNewTrxStepAddr | Die Adresse des erstellte Transaktionsschritts, um Indexe veralten zu können (siehe auch IndexPool::ObjectStrIndex::m_ReservedIndexMultiMap). |
[in] | rCommunicatorWithTreadID | Der Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten möchte. |
[in] | eAction | Die Aktion wie mit dem Datensatz umgegangen werden soll; speichern oder löschen. |
[in] | pActionRecord | Der Datensatz, welcher gespeichert bzw. gelöscht werden soll. Es wird der Datensatz kopiert und nicht 'remembert'. |
|
private |
Noch nicht implementiert!
|
private |
Wenn rekursiv Datensätze gelesen werden, kommen die schon gelesene Datensätze hier rein.
|
private |
Eine Map mit den Transaktionen. Key ist die auf NUM_PTR gecastete Adresse des Communicator's für den eine Transaktion erstellt wurde .
|
private |
Ein interner Iterator auf die Map mit den Transaktionen (m_TransactionStackMap).