///

Projekt: KZIS ///

Author : M. Brousek ///

Created: 29.4.2010 ///

Description: Třída BO pro práci s transakcemi systému KZIS ///

Transakce v systému KZIS ohraničuje jednoznačně určitelný proces, který byl spuštěn z rozhraní definovaného v systému. /// Každá transakce je spouštěna jedinečnou událostí, přičemž proces, prvotně spuštěný touto událostí, může sám v rámci stejné transakce volat další procesy. /// Prvotně spuštěný proces je určen kódem druhu transakce, který se povinně zadává při jejím zahájení /// (Viz též třída druhu transakce KZIS.Data.TS.TransactionKind). /// Způsob spuštění transakce je pak určen třídou události rozhraní KZIS.Data.TS.MWEvent, která danou transakci vyvolala. /// Viz též metoda StartTransaction ///

V případě přenosu nebo manipulace s daty by veškeré příslušné procesy měly být realizovány v rámci transakce tak, /// aby z jakéhokoli datového záznamu bylo možné určit, v rámci které transakce tento záznam vznikl nebo byl modifikován. ///

Transakce není DB transakcí ve smyslu atomizace procesu přenášených dat, tzn., že chyba, nastalá v běhu transakce, neznamená automaticky její ukončení. /// Záleží vždy na konkrétním spuštěném procesu, jak případné chyby ošetří. Class KZIS.BO.TS.Transactions Extends Ens.BusinessOperation [ ProcedureBlock ] { Parameter INVOCATION = "Queue"; /// Zahájení transakce systému KZIS. ///

Při startu každě transakce musí být v požadavku pRequest jednoznačně určena událost, která danou transakci vyvolala /// a proces, který se má v rámci transakce spustit. V odpovědi pResponse je pak navrácena instance spuštěné transakce. /// Viz též KZIS.Msg.MW.BPDataRequest a KZIS.Msg.MW.CommonDataResponse ///

Metoda nastaví stav dané transakce na hodnotu KZIS.Data.TS.States.tsStarted Method StartTransaction(pRequest As KZIS.Msg.MW.BPDataRequest, Output pResponse As KZIS.Msg.MW.CommonDataResponse) As %Status { set tSC = $$$OK TRY { $$$LOGINFO("Starting transaction code: '"_pRequest.TransactionKindCode_"'") set NewTransaction = ##class(KZIS.Data.TS.MWTransaction).%New() set NewTransaction.Event = pRequest.Event set NewTransaction.Kind = ##class(KZIS.Data.TS.TransactionKind).OpenCode(pRequest.TransactionKindCode) do NewTransaction.%Save() do NewTransaction.Start() set pResponse = ##class(KZIS.Msg.MW.CommonDataResponse).%New() set pResponse.Transaction = NewTransaction $$$LOGINFO("Transaction: '"_NewTransaction.Kind.Description_"' has been started") } CATCH { $$$LOGERROR("Transaction error: Exception("_$ECODE_")") set tSC = $$$ERROR($ECODE) } Quit tSC } /// Úspěšné ukončení transakce. ///

V požadavku pRequest se zadává instance třídy transakce, která se má ukončit. ///

Metoda nastaví stav dané transakce na hodnotu KZIS.Data.TS.States.tsFinished Method Commit(pRequest As KZIS.Msg.MW.CommitTransactionRequest, Output pResponse As KZIS.Msg.MW.CommonDataResponse) As %Status { set tSC = $$$OK TRY { set pResponse = ##class(KZIS.Msg.MW.CommonDataResponse).%New() set pResponse.Transaction = pRequest.Transaction do pRequest.Transaction.Commit() $$$LOGINFO("Transaction: '"_pRequest.Transaction.Kind.Description_"' has been commited") } CATCH { $$$LOGERROR("Commit transaction error: Exception("_$ECODE_")") set tSC = $$$ERROR($ECODE) } Quit tSC } /// Ukončení transakce chybou. ///

Metoda zaznamená ukončení transakce, v jejímž průběhu došlo k chybě. /// Zaznamenání chybné transakce není návratem do stavu před jejím spuštěním (rollback), /// ošetření nastalých chyb vždy záleží na procesu, který je v rámci dané transakce spuštěn. ///

V požadavku pRequest se zadává instance třídy transakce, která se má ukončit. ///

Metoda nastaví stav dané transakce na hodnotu KZIS.Data.TS.States.tsError Method Error(pRequest As KZIS.Msg.MW.ErrorTransactionRequest, Output pResponse As KZIS.Msg.MW.CommonDataResponse) As %Status { set tSC = $$$OK TRY { set pResponse = ##class(KZIS.Msg.MW.CommonDataResponse).%New() set pResponse.Transaction = pRequest.Transaction do pRequest.Transaction.Error() $$$LOGINFO("ERROR in transaction: '"_pRequest.Transaction.Kind.Description_"'") } CATCH { $$$LOGERROR("Mark transaction error exception("_$ECODE_")") set tSC = $$$ERROR($ECODE) } Quit tSC } XData MessageMap { StartTransaction Commit Error } }