diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
new file mode 100644
index 0591f3f..495684e
*** a/src/backend/access/transam/xact.c
--- b/src/backend/access/transam/xact.c
*************** PreventTransactionChain(bool isTopLevel,
*** 2961,2966 ****
--- 2961,2969 ----
   *	use of the current statement's results.  Likewise subtransactions.
   *	Thus this is an inverse for PreventTransactionChain.
   *
+  *	While top-level transaction control commands (BEGIN/COMMIT/ABORT)
+  *	outside of transactions issue warnings, these generate errors.
+  *
   *	isTopLevel: passed down from ProcessUtility to determine whether we are
   *	inside a function.
   *	stmtType: statement type name, for error messages.
*************** UserAbortTransactionBlock(void)
*** 3425,3436 ****
  
  			/*
  			 * The user issued ABORT when not inside a transaction. Issue a
! 			 * NOTICE and go to abort state.  The upcoming call to
  			 * CommitTransactionCommand() will then put us back into the
  			 * default state.
  			 */
  		case TBLOCK_STARTED:
! 			ereport(NOTICE,
  					(errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION),
  					 errmsg("there is no transaction in progress")));
  			s->blockState = TBLOCK_ABORT_PENDING;
--- 3428,3439 ----
  
  			/*
  			 * The user issued ABORT when not inside a transaction. Issue a
! 			 * WARNING and go to abort state.  The upcoming call to
  			 * CommitTransactionCommand() will then put us back into the
  			 * default state.
  			 */
  		case TBLOCK_STARTED:
! 			ereport(WARNING,
  					(errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION),
  					 errmsg("there is no transaction in progress")));
  			s->blockState = TBLOCK_ABORT_PENDING;
diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out
new file mode 100644
index fa0bd82..4061512
*** a/src/test/regress/expected/errors.out
--- b/src/test/regress/expected/errors.out
*************** ERROR:  column name "oid" conflicts with
*** 114,120 ****
  -- TRANSACTION STUFF
  -- not in a xact
  abort;
! NOTICE:  there is no transaction in progress
  -- not in a xact
  end;
  WARNING:  there is no transaction in progress
--- 114,120 ----
  -- TRANSACTION STUFF
  -- not in a xact
  abort;
! WARNING:  there is no transaction in progress
  -- not in a xact
  end;
  WARNING:  there is no transaction in progress
