Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  ma_commit.c   Sprache: C

 

/* Copyright (C) 2007-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */


#include "maria_def.h"
#include "trnman.h"
#include "ma_trnman.h"

/**
   writes a COMMIT record to log and commits transaction in memory

   @param  trn              transaction

   @return Operation status
     @retval 0      ok
     @retval 1      error (disk error or out of memory)
*/


int ma_commit(TRN *trn)
{
  int res;
  LSN commit_lsn;
  LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS];
  DBUG_ENTER("ma_commit");

  DBUG_ASSERT(trn->rec_lsn == LSN_IMPOSSIBLE);
  if (trn->undo_lsn == 0) /* no work done, rollback (cheaper than commit) */
    DBUG_RETURN(trnman_rollback_trn(trn));
  /*
    - if COMMIT record is written before trnman_commit_trn():
    if Checkpoint comes in the middle it will see trn is not committed,
    then if crash, Recovery might roll back trn (if MY_MIN(rec_lsn) is after
    COMMIT record) and this is not an issue as
    * transaction's updates were not made visible to other transactions
    * "commit ok" was not sent to client
    Alternatively, Recovery might commit trn (if MY_MIN(rec_lsn) is before
    COMMIT record), which is ok too. All in all it means that "trn committed"
    is not 100% equal to "COMMIT record written".
    - if COMMIT record is written after trnman_commit_trn():
    if crash happens between the two, trn will be rolled back which is an
    issue (transaction's updates were made visible to other transactions).
    So we need to go the first way.

    Note that we have to use | here to ensure that all calls are made.
  */


  /*
    We do not store "thd->transaction.xid_state.xid" for now, it will be
    needed only when we support XA.
  */

  res= (translog_write_record(&commit_lsn, LOGREC_COMMIT,
                             trn, NULL, 0,
                             sizeof(log_array)/sizeof(log_array[0]),
                             log_array, NULL, NULL) |
        translog_flush(commit_lsn));

  DBUG_EXECUTE_IF("maria_sleep_in_commit",
                  {
                    DBUG_PRINT("info", ("maria_sleep_in_commit"));
                    sleep(3);
                  });
  res|= trnman_commit_trn(trn);


  /*
    Note: if trnman_commit_trn() fails above, we have already
    written the COMMIT record, so Checkpoint and Recovery will see the
    transaction as committed.
  */

  DBUG_RETURN(res);
}


/**
   Writes a COMMIT record for a transaction associated with a file

   @param  info              Maria handler

   @return Operation status
     @retval 0      ok
     @retval #      error (disk error or out of memory)
*/


int maria_commit(MARIA_HA *info)
{
  TRN *trn;
  if (!info->s->now_transactional)
    return 0;
  trn= info->trn;
  _ma_reset_trn_for_table(info);
  return ma_commit(trn);
}


/**
   Starts a transaction on a file handle

   @param  info              Maria handler

   @return Operation status
     @retval 0      ok
     @retval #      Error code.

   @note this can be used only in single-threaded programs (tests),
   because we create a transaction (trnman_new_trn) with WT_THD=0.
   XXX it needs to be fixed when we'll start using maria_begin from SQL.
*/


int maria_begin(MARIA_HA *info)
{
  DBUG_ENTER("maria_begin");

  if (info->s->now_transactional)
  {
    TRN *trn= trnman_new_trn(0);
    if (unlikely(!trn))
      DBUG_RETURN(HA_ERR_OUT_OF_MEM);
    _ma_set_trn_for_table(info, trn);
  }
  DBUG_RETURN(0);
}

Messung V0.5 in Prozent
C=95 H=100 G=97

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet am  2026-10-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126438
#Domains=1867298