///
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
}
}