xact.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:38k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * xact.c
  4.  *   top level transaction system support routines
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.42.2.3 1999/09/09 16:29:22 tgl Exp $
  11.  *
  12.  * NOTES
  13.  * Transaction aborts can now occur two ways:
  14.  *
  15.  * 1) system dies from some internal cause  (Assert, etc..)
  16.  * 2) user types abort
  17.  *
  18.  * These two cases used to be treated identically, but now
  19.  * we need to distinguish them.  Why? consider the following
  20.  * two situatuons:
  21.  *
  22.  * case 1 case 2
  23.  * ------ ------
  24.  * 1) user types BEGIN 1) user types BEGIN
  25.  * 2) user does something 2) user does something
  26.  * 3) user does not like what 3) system aborts for some reason
  27.  *    she shes and types ABORT
  28.  *
  29.  * In case 1, we want to abort the transaction and return to the
  30.  * default state. In case 2, there may be more commands coming
  31.  * our way which are part of the same transaction block and we have
  32.  * to ignore these commands until we see an END transaction.
  33.  * (or an ABORT! --djm)
  34.  *
  35.  * Internal aborts are now handled by AbortTransactionBlock(), just as
  36.  * they always have been, and user aborts are now handled by
  37.  * UserAbortTransactionBlock().  Both of them rely on AbortTransaction()
  38.  * to do all the real work.  The only difference is what state we
  39.  * enter after AbortTransaction() does it's work:
  40.  *
  41.  * * AbortTransactionBlock() leaves us in TBLOCK_ABORT and
  42.  * * UserAbortTransactionBlock() leaves us in TBLOCK_ENDABORT
  43.  *
  44.  *  NOTES
  45.  * This file is an attempt at a redesign of the upper layer
  46.  * of the V1 transaction system which was too poorly thought
  47.  * out to describe.  This new system hopes to be both simpler
  48.  * in design, simpler to extend and needs to contain added
  49.  * functionality to solve problems beyond the scope of the V1
  50.  * system.  (In particuler, communication of transaction
  51.  * information between parallel backends has to be supported)
  52.  *
  53.  * The essential aspects of the transaction system are:
  54.  *
  55.  * o  transaction id generation
  56.  * o  transaction log updating
  57.  * o  memory cleanup
  58.  * o  cache invalidation
  59.  * o  lock cleanup
  60.  *
  61.  * Hence, the functional division of the transaction code is
  62.  * based on what of the above things need to be done during
  63.  * a start/commit/abort transaction.  For instance, the
  64.  * routine AtCommit_Memory() takes care of all the memory
  65.  * cleanup stuff done at commit time.
  66.  *
  67.  * The code is layered as follows:
  68.  *
  69.  * StartTransaction
  70.  * CommitTransaction
  71.  * AbortTransaction
  72.  * UserAbortTransaction
  73.  *
  74.  * are provided to do the lower level work like recording
  75.  * the transaction status in the log and doing memory cleanup.
  76.  * above these routines are another set of functions:
  77.  *
  78.  * StartTransactionCommand
  79.  * CommitTransactionCommand
  80.  * AbortCurrentTransaction
  81.  *
  82.  * These are the routines used in the postgres main processing
  83.  * loop.  They are sensitive to the current transaction block state
  84.  * and make calls to the lower level routines appropriately.
  85.  *
  86.  * Support for transaction blocks is provided via the functions:
  87.  *
  88.  * StartTransactionBlock
  89.  * CommitTransactionBlock
  90.  * AbortTransactionBlock
  91.  *
  92.  * These are invoked only in responce to a user "BEGIN", "END",
  93.  * or "ABORT" command.  The tricky part about these functions
  94.  * is that they are called within the postgres main loop, in between
  95.  * the StartTransactionCommand() and CommitTransactionCommand().
  96.  *
  97.  * For example, consider the following sequence of user commands:
  98.  *
  99.  * 1) begin
  100.  * 2) retrieve (foo.all)
  101.  * 3) append foo (bar = baz)
  102.  * 4) end
  103.  *
  104.  * in the main processing loop, this results in the following
  105.  * transaction sequence:
  106.  *
  107.  * / StartTransactionCommand();
  108.  * 1) / ProcessUtility(); << begin
  109.  *     StartTransactionBlock();
  110.  * CommitTransactionCommand();
  111.  *
  112.  * / StartTransactionCommand();
  113.  * 2) < ProcessQuery(); << retrieve (foo.all)
  114.  * CommitTransactionCommand();
  115.  *
  116.  * / StartTransactionCommand();
  117.  * 3) < ProcessQuery(); << append foo (bar = baz)
  118.  * CommitTransactionCommand();
  119.  *
  120.  * / StartTransactionCommand();
  121.  * 4) / ProcessUtility(); << end
  122.  *     CommitTransactionBlock();
  123.  * CommitTransactionCommand();
  124.  *
  125.  * The point of this example is to demonstrate the need for
  126.  * StartTransactionCommand() and CommitTransactionCommand() to
  127.  * be state smart -- they should do nothing in between the calls
  128.  * to StartTransactionBlock() and EndTransactionBlock() and
  129.  * outside these calls they need to do normal start/commit
  130.  * processing.
  131.  *
  132.  * Furthermore, suppose the "retrieve (foo.all)" caused an abort
  133.  * condition. We would then want to abort the transaction and
  134.  * ignore all subsequent commands up to the "end".
  135.  * -cim 3/23/90
  136.  *
  137.  *-------------------------------------------------------------------------
  138.  */
  139. /*
  140.  * Large object clean up added in CommitTransaction() to prevent buffer leaks.
  141.  * [PA, 7/17/98]
  142.  * [PA] is Pascal Andr