350 likes | 365 Views
Explore the complex world of transaction managers through this detailed guide, covering key concepts, data structures, and implementation methods in the realm of software development.
E N D
Software is like entropy. It is difficult to grasp, weighs nothing, and obeys the Second Law of Thermodynamics; i.e., it always increases. Norman Augstine Transaction Manager Mon Tue Wed Thur Fri 9:00 Overview TP mons Log+RM Files &Buffers B-tree 11:00 Faults Lock Theory TM COM+ Access Paths 1:30 Tolerance Lock Techniq CICS & Inet Corba Groupware 3:30 T Models Queues Adv TM Replication Benchmark 7:00 Party Workflow Cyberbrick Party Gray& Reuter: Transaction Mgr
When Everything Works Normally, no resorce manager fails, and the system is up.The TM receives the following calls: • Begin_Work(), • Save_Work(), • Prepare_Work(), • Commit_Work(), • Rollback_Work(), • Read_ Context(). Gray& Reuter: Transaction Mgr
Other “Normal” Calls Normally, no resorce manager fails, and the system is up.The TM receives the following calls: • Leave_Transaction(), • Resume_Transaction(), • Status_Transaction(), • Identify(), • Join_Work(). Gray& Reuter: Transaction Mgr
The TM And Context • With each type of savepoint, the TM can record context information for the transaction. • Context is provided by a resource manager and can be reestablished when the transaction returns to that savepoint. • For the TM, context is only a string of bytes. • The “meaning” of context is only understood by the subsystem that created it. The context established by a database system is different from the one provided by a transactional GUI. Gray& Reuter: Transaction Mgr
Transaction Identifiers TRIDs must be created at high rates at each node in a distributed system. TRIDs must be unique in time and space. This is the structure of a TRID: typedef struct {TIMESTAMP BirhtdayOf TM; RMID IDofTM; long LocalSqncNo; char FutureUse[2]; } TRID; Gray& Reuter: Transaction Mgr
The TM´s Data Structures Gray& Reuter: Transaction Mgr
What the TM Knows About RMs typedef struct { RMCB * NextRMCB; char RMName[BIG]; RMID IDofRM; Boolean RMisUP; LSN OldestLogRecForREDO; LSN CheckpointLSN; } RMCB; Gray& Reuter: Transaction Mgr
What the TM Knows About Transactions typedef struct { TransCB * NextTranCBt; TRID TRIDofTran; tran_status StatusOfTran; long NextSaveptNo; long CurrentSaveptNo; LSN LSNofCurrentSavept; LSN MostRecentLSNofTran; LSN FirstLSNofTran; to be continued ... Gray& Reuter: Transaction Mgr
. . . Knows About Transactions RMTranCB * RMsAttachedToTran; SECB * SessionsAttachedToTran; pointer LocksHeldByTran; pointer LockTranWaitsFor; long TimeoutForLockWaits; TransCB * ForDeadlockDetector; } TransCB; Gray& Reuter: Transaction Mgr
Some Simple Addressing Functions TRID MyTrid(void); Returns transaction identifier of caller’s process. TransCB MyTrans(void); Returns a copy of caller’s transaction CB. TransCB * MyTransP(void); Returns pointer to caller’s transaction CB. Gray& Reuter: Transaction Mgr
Implementation of MyTrid TRID MyTrid(void) /*return curr. TRID of calling process*/ { TransCB * mytranp = MyTransP(); /*pointer to caller’s TA CB */ if ( mytranp != NULL ) return mytranp->trid; /*return his trid if he has one*/ else return NULLTrid;} /*no trid if caller has no control blk*/ Gray& Reuter: Transaction Mgr
Savepoints There are seven basic types of savepoints: • Begin • Save • Prepare • Rollback • Commit • Abort • Complete Gray& Reuter: Transaction Mgr
The TM Savepoint Log Record typedef struct { SAVE_PT_TYPE RecordType; long SaveptNum; tran_status Status; Boolean SoftOrPersistent; long NumRMs; RMTransCB RM[NumRMs]; long NumSess; SECB Session[NumSess]; context ContextData; } TM_savepoint; Gray& Reuter: Transaction Mgr
Implementation of Begin_Work TRID Begin_Work(context * it, Boolean soft) {TransCB * trans; /*the transaction’s descriptor */ TRID him; /*the newTRID */ TM_savepoint save; /*the savept record */ if (MyTrid() != NULLTrid) return(NULLTrid); him = TM_anchor.next_trid; /*give nextTRID */ TM_anchor.next_trid.sequence++; (MyProcessP())->trid = him; trans = malloc(sizeof(TransCB)); trans->next = TM_anchor.tran_list; TM_anchor.tran_list = trans; trans->trid = him Gray& Reuter: Transaction Mgr
Implementation of Begin_Work trans->status = ACTIVE; trans->save_pt = 1; trans->next_save_pt = 2; trans->RM_list = trans->lock_list = trans->ses_list = NULL; save.record_type = begin; save.save_pt_num= 1; save.soft = soft; save.num_RM = save.sessions = 0; copy(save.it, it, it.length); trans->save_pt_lsn = log_insert( save, sizeof(save)); if (!soft) log_flush(trans->max_lsn,FALSE); return(him); }; Gray& Reuter: Transaction Mgr
Implementation of Commit_Work Boolean Commit_Work(context * it, Boolean lazy) { TransCB * trans = MyTransP(); TM_savepoint save; long save_num Boolean vote; RMTransCB * rm; SECB * session; if (MyTrid() == NULLTrid) return(0); for each rm in trans->RM_list {rm->prepared =rmid.Prepare(&rm->save_pt_lsn)) if (!rm->prepared) { Abort_Work(); return FALSE;};} Gray& Reuter: Transaction Mgr
Implementation of Commit_Work for each outgoing session in trans->ses_list {vote = TM.Prepare(void); if (! vote or timeout) { Abort_Work(); return FALSE;};}; trans->status = PREPARED; save_num = trans->save_pt ++; save.record_type = commit; save.soft = FALSE; save.save_pt_num = save_num; copy(save, trans->RM_list); copy(save, trans->ses_list); copy(save.it, it); Gray& Reuter: Transaction Mgr
Implementation of Commit_Work trans->save_pt_lsn = log_insert( save, sizeof(save)); log_flush(trans->max_lsn, lazy); trans->status = COMMITTING; for each rm in trans->RM_list { if ( rmid.Commit( )) { deallocate rmid from transaction;}; else {rm_commit(&rm);};}; for each outgoing session in trans->ses_list { TM.Commit(); if (! timeout) { free session; } else {session_failure(&session);};}; Gray& Reuter: Transaction Mgr
Implementation of Commit_Work if ( trans->RM_list == NULL && trans->ses_list == NULL) { trans->status = COMMITTED; save.record_type = commit_complete; log_insert( save, sizeof(header)+sizeof(record_type)); dequeue and free trans structure;} (MyProcessP())->trid = NULLTrid; return TRUE; }; Gray& Reuter: Transaction Mgr
Data Flow at Commit Outgoing Sessions From Application or Remote Transaction Remote Manager Transaction Managers and Servers Savepoint Local Rollback Transaction Prepare Manager Commit / Abort Joined Resource Managers Gray& Reuter: Transaction Mgr
Handling a Session Failure void session_failure(SECB * session) { TransCB * trans = MyTransP(); Boolean timeout = TRUE; TM_savepoint save; RMID TM= session->him; while( timeout) { TM.Commit( );}; free session; if ( trans->RM_list == NULL && trans->ses_list == NULL) { trans->status = COMMITTED; save.record_type = commit_complete; log_insert( save, sizeof(save)); dequeue and free trans structure;}; exit(); }; Gray& Reuter: Transaction Mgr
Distributed Commit participant root Communications Manager Ø1 TM.Prepare() Ø1 Ø1 Local TM Ø2 callbacks Ø2 Ø2 TM. Commit() participant participant Ø1 Ø1 Ø1 Ø2 Ø2 Ø2 participant participant Gray& Reuter: Transaction Mgr
Coordinator Failure void coordinator_failure(SECB * session) tran_status outcome = prepared; RMID TM= session->him; while( outcome not in {committing, aborting}) { outcome=TM.Status_Transaction(MyTrid());}; switch (outcome) { aborting: Abort(); break; committing:Commit( ); break; } exit(); }; Gray& Reuter: Transaction Mgr
Savepoint Logic In the TM´s savepoint record, the LSNs of the participating resource managers are recored, so they can be reestablished later on. Gray& Reuter: Transaction Mgr
Savepoint Implementation int Save_Work(context * it, Boolean soft) {TransCB * trans = MyTransP(); TM_savepoint save; long save_num; RMTransCB * rm; SECB * session; Boolean vote; if (MyTrid() == NULLTrid) return(0); save_num = trans->next_save_pt + +; for each rm in trans->RM_list if( ! vote = rmid.Savepoint(&rm->save_pt_lsn ))) { Abort_Work(); return 0;}; Gray& Reuter: Transaction Mgr
Savepoint Implementation for each session in trans->ses_list { vote = TM.Savepoint(save_num); if (timeout || ! vote ) { Abort_Work(); return 0;};}; trans->save_pt = trans->next_save_pt++; save.record_type = save; save.save_pt_num = save_num; save.soft = soft; copy(save, trans->RM_list); copy(save, trans->ses_list); copy(save.it, it); trans->save_pt_lsn = log_insert( save, sizeof(save)); if (!soft) log_flush(trans->max_lsn, soft); return save_num; }; Gray& Reuter: Transaction Mgr
The UNDO of Savepoints void UNDO(LSN lsn) {TransCB * trans = MyTransP(); TM_savepoint save; TRID him =MyTrid(); RMID rmid; RMTransCB * rm; SECB * session; log_record_header header; Boolean vote=TRUE; log_read(lsn,&header,save,sizeof(save)); trans->save_pt = save.save_pt_num; Gray& Reuter: Transaction Mgr
The UNDO of Savepoints for each rm in trans->RM_list { if ( rm is in save ) rm->save_pt_lsn = save.RM.save_pt_lsn; else rm->save_pt_lsn = NULLlsn;. vote= vote || rmid.UNDO_Savepoint(rm->save_pt_lsn);} for each session in trans->ses_list vote = vote || TM.UNDO_Savepoint(trans->save_pt); if ( vote ) { trans->max_lsn = header.tran_prev_lsn; trans->save_pt_lsn = log_insert(save,sizeof(save));} return;}; Gray& Reuter: Transaction Mgr
Rollback Log Records Compensation log records Rollback UnDo Begin UnDo UnDo UnDo Save Do Do Do Do Do Do Do Do Do Gray& Reuter: Transaction Mgr
System Restart Gray& Reuter: Transaction Mgr
Transaction States at Restart Gray& Reuter: Transaction Mgr
Resource Manager at Restart Gray& Reuter: Transaction Mgr
Using Two Checkpoints For Restart One scan for ALL RMs Gray& Reuter: Transaction Mgr
Why Restart Works Gray& Reuter: Transaction Mgr