GlobalObjects
Lade ...
Suche ...
Keine Treffer
glo::TransactionManager Klassenreferenz

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::CommunicatorTransactionStackgetTransactionStack (const TransactionOwner &rCommunicatorWithTreadID)
 
void removeCurrentTransactionStack ()
 

Private Methoden

 TransactionManager (const TransactionManager &)
 
TransactionManageroperator= (const TransactionManager &)
 
int writeTransactionFile (CommunicatorTransactionStack *pTransactionStack)
 

Private Attribute

std::unordered_map< ObjID, Record *, glo::ObjID::HashFunctionm_RecursionRecordMap
 
std::map< TransactionOwner, CommunicatorTransactionStack *, std::less< TransactionOwner > > m_TransactionStackMap
 
std::map< TransactionOwner, CommunicatorTransactionStack * >::iterator m_TransactionStackMapIterator
 

Ausführliche Beschreibung

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.

Autor
Helmut Jakoby

Dokumentation der Aufzählungstypen

◆ EnStoreDelete

Intern, welche Aktion ausgeführt werden soll.

Aufzählungswerte
eTRX_STORE 

Es soll gespeichert werden.

eTRX_DELETE 

Es soll gelöscht werden.

Beschreibung der Konstruktoren und Destruktoren

◆ TransactionManager() [1/2]

glo::TransactionManager::TransactionManager ( )

Standard-Konstruktor.

◆ ~TransactionManager()

virtual glo::TransactionManager::~TransactionManager ( )
virtual

Destruktor.

◆ TransactionManager() [2/2]

glo::TransactionManager::TransactionManager ( const TransactionManager & )
private

Der Copy-Konstruktor steht nicht zur Verfügung.

Dokumentation der Elementfunktionen

◆ abortTransaction()

int glo::TransactionManager::abortTransaction ( std::list< TransactionBase * > & rAbortedTransactionStepList,
const TransactionOwner & rCommunicatorWithTreadID )

Es wird aktuelle Transaktion abgebrochen.

Parameter
[in,out]rAbortedTransactionStepListIn dieser Liste werden die verworfenen TransactionSteps geliefert (müssen u.a. noch im LockManager freigegeben werden).
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der die Transaktion abbricht.
Rückgabe
Eine Rückgabe < 0 zeigt einen Fehler an.
Achtung
Die Objekte in der gelieferten Liste müssen von der aufrufenden Instanz aus dem Speicher entfernt werden.

◆ beginTransaction()

void glo::TransactionManager::beginTransaction ( const TransactionOwner & rCommunicatorWithTreadID)

Beginnt eine neue Transaktion, indem ein neuer TransactionPoint auf den Transaktions-Stack gelegt wird.

Parameter
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der die Transaktion startet.
Ausnahmebehandlung
eut::ErrorNExceptionBei einem Fehler wird eine Exception geworfen.

◆ commitTransaction()

int glo::TransactionManager::commitTransaction ( CommunicatorTransactionStack *& prRetVal,
const TransactionOwner & rCommunicatorWithTreadID )

Es wird aktuelle Transaktion akzeptiert.

Parameter
[in,out]prRetValWenn Rückgabe > 0, dann wird der Transaktions-Stack des Client-Kommunikators zum ausführen der Arbeitsschritte geliefert.
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der die Transaktion commited.
Rückgabe
Eine Rückgabe > 0 zeigt an, dass der gelieferte Transaktions-Stack abgearbeitet werden kann.
Eine Rückgabe == 0 zeigt an, dass innerhalb einer geschachtelten Transaktion akzeptiert wurde.
Eine Rückgabe < 0 zeigt einen Fehler an.
Achtung
Das gelieferte Objekt muss von der aufrufenden Instanz aus dem Speicher entfernt werden.

◆ deleteAllTransactions()

void glo::TransactionManager::deleteAllTransactions ( Communicator * pCommunicator)

Es werden alle, ggf. vorhanden, Transaktionen des übergebenen Client-Kommunikator entfernt.

Parameter
[in]pCommunicatorDer Client-Kommunikator.

◆ getActionRecord() [1/2]

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.

Parameter
[in,out]prRetValDie Datensatz, wenn vorhanden.
[in,out]reActionDie Aktion wie mit dem Datensatz umgegangen werden sollte; speichern oder löschen.
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten wollte.
[in]rObjIDDie Objekt-ID des gewünschten Datensatzes.
[in]rsDataPathDer Datei-Pfad um ggf. die Objekt-IDs aus Dateien zu holen.
[in]bInRecursionWenn true, dann Aufruf in sich selbst.
Rückgabe
Ein Rückgabewert < 0 zeigt einen Fehler an.
Achtung
Die aufrufende Instanz muss den evtl. gelieferten Datensatz mittels Record::forget() aus dem Speicher entfernen. Es wird empfohlen, die gleichnamige Methode mit einen std::shared_ptr zu nutzen.
Zu beachten
Für Glo-Entwickler: Ist in GloRecordAttributeFunctions.cpp implementiert, damit Erweiterungen von Datensatz-Attributen dort gesammelt vorgenommen werden können.

◆ getActionRecord() [2/2]

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.

Parameter
[in,out]rRetValDie Datensatz, wenn vorhanden.
[in,out]reActionDie Aktion wie mit dem Datensatz umgegangen werden sollte; speichern oder löschen.
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten wollte.
[in]rObjIDDie Objekt-ID des gewünschten Datensatzes.
[in]rsDataPathDer Datei-Pfad um ggf. die Objekt-IDs aus Dateien zu holen.
[in]bInRecursionWenn true, dann Aufruf in sich selbst.
Rückgabe
Ein Rückgabewert < 0 zeigt einen Fehler an.

◆ getTransactionStack()

TransactionManager::CommunicatorTransactionStack * glo::TransactionManager::getTransactionStack ( const TransactionOwner & rCommunicatorWithTreadID)
protected

Liefert einen Zeiger auf den Transaktions-Stack des übergebenen Client-Kommunikator.

Parameter
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID.
Rückgabe
Der Zeiger auf einen, ggf. vorhandenen, Transaktions-Stack. Wenn der Client-Kommunikator keine Transaktion am Laufen hat, ist der Rückgabewert == nullptr.

◆ inTransaction()

bool glo::TransactionManager::inTransaction ( const TransactionOwner & rCommunicatorWithTreadID) const

Prüft ob übergebener Client-Kommunikator eine Transaktion am Laufen hat.

Parameter
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID.
Rückgabe
Wenn true, hat der übergebener Client-Kommunikator eine Transaktion am Laufen.

◆ operator=()

TransactionManager & glo::TransactionManager::operator= ( const TransactionManager & )
private

Der Zuweisungsoperator steht nicht zur Verfügung.

◆ removeCurrentTransactionStack()

void glo::TransactionManager::removeCurrentTransactionStack ( )
protected

Entfernt den aktuellen Transaktions-Stack. Wenn eine nachfolgende Transaktion vorhanden ist, wird diese zur aktuellen Transaktion in der m_TransactionStackMap.

◆ setTransactionStep()

int glo::TransactionManager::setTransactionStep ( NUM_PTR & nNewTrxStepAddr,
const TransactionOwner & rCommunicatorWithTreadID,
EnStoreDelete eAction,
Record * pActionRecord )

Generiert einen TransactionStep und legt diesen auf den Transaktions-Stack.

Parameter
[in,out]nNewTrxStepAddrDie Adresse des erstellte Transaktionsschritts, um Indexe veralten zu können (siehe auch IndexPool::ObjectStrIndex::m_ReservedIndexMultiMap).
[in]rCommunicatorWithTreadIDDer Client-Kommunikator mit Thread-ID, der den Datensatz in einer Transaktion bearbeiten möchte.
[in]eActionDie Aktion wie mit dem Datensatz umgegangen werden soll; speichern oder löschen.
[in]pActionRecordDer Datensatz, welcher gespeichert bzw. gelöscht werden soll. Es wird der Datensatz kopiert und nicht 'remembert'.
Rückgabe
Ein Rückgabewert < 0 zeigt einen Fehler an.

◆ writeTransactionFile()

int glo::TransactionManager::writeTransactionFile ( CommunicatorTransactionStack * pTransactionStack)
private

Noch nicht implementiert!

Dokumentation der Datenelemente

◆ m_RecursionRecordMap

std::unordered_map< ObjID, Record *, glo::ObjID::HashFunction > glo::TransactionManager::m_RecursionRecordMap
private

Wenn rekursiv Datensätze gelesen werden, kommen die schon gelesene Datensätze hier rein.

◆ m_TransactionStackMap

std::map< TransactionOwner, CommunicatorTransactionStack *, std::less<TransactionOwner> > glo::TransactionManager::m_TransactionStackMap
private

Eine Map mit den Transaktionen. Key ist die auf NUM_PTR gecastete Adresse des Communicator's für den eine Transaktion erstellt wurde .

◆ m_TransactionStackMapIterator

std::map<TransactionOwner,CommunicatorTransactionStack*>::iterator glo::TransactionManager::m_TransactionStackMapIterator
private

Ein interner Iterator auf die Map mit den Transaktionen (m_TransactionStackMap).


Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Datei: