001: /*
002:
003: Derby - Class org.apache.derby.impl.store.access.RAMTransactionContext
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.store.access;
023:
024: import org.apache.derby.iapi.services.sanity.SanityManager;
025: import org.apache.derby.iapi.error.StandardException;
026: import org.apache.derby.iapi.store.access.TransactionController;
027: import org.apache.derby.iapi.services.context.ContextManager;
028:
029: import org.apache.derby.iapi.services.context.ContextImpl;
030: import org.apache.derby.iapi.error.ExceptionSeverity;
031:
032: final class RAMTransactionContext extends ContextImpl {
033: /**
034: The transaction this context is managing.
035: **/
036: protected RAMTransaction transaction;
037:
038: /**
039: true if any exception causes this transaction to be destroyed
040: **/
041: private boolean abortAll;
042:
043: /*
044: ** Context methods (most are implemented by super-class).
045: */
046:
047: /**
048: Handle cleanup processing for this context. The resources
049: associated with a transaction are the open controllers.
050: Cleanup involves closing them at the appropriate time.
051: Rollback of the underlying transaction is handled by the
052: raw store.
053: **/
054: public void cleanupOnError(Throwable error)
055: throws StandardException {
056: if (SanityManager.DEBUG)
057: SanityManager.ASSERT(getContextManager() != null);
058:
059: boolean destroy = false;
060:
061: if (abortAll == false && (error instanceof StandardException)) {
062: StandardException se = (StandardException) error;
063:
064: // If the severity is lower than a transaction error then do nothing.
065: if (se.getSeverity() < ExceptionSeverity.TRANSACTION_SEVERITY)
066: return;
067:
068: // If the session is going to disappear then we want to destroy this
069: // transaction, not just abort it.
070: if (se.getSeverity() >= ExceptionSeverity.SESSION_SEVERITY)
071: destroy = true;
072: } else {
073: // abortAll is true or some java* error, throw away the
074: // transaction.
075: destroy = true;
076: }
077:
078: if (transaction != null) {
079: try {
080: transaction.invalidateConglomerateCache();
081: } catch (StandardException se) {
082: // RESOLVE - what to do in error case.
083: if (SanityManager.DEBUG)
084: SanityManager
085: .THROWASSERT("got error while invalidating cache.");
086: }
087:
088: transaction
089: .closeControllers(true /* close held controllers */);
090: }
091:
092: if (destroy) {
093: transaction = null;
094: popMe();
095: }
096:
097: }
098:
099: /*
100: ** Methods of RAMTransactionContext
101: */
102:
103: // this constructor is called with the transaction
104: // controller to be saved when the context
105: // is created (when the first statement comes in, likely).
106: RAMTransactionContext(ContextManager cm, String context_id,
107: RAMTransaction theTransaction, boolean abortAll)
108: throws StandardException {
109: super (cm, context_id);
110:
111: this .abortAll = abortAll;
112: transaction = theTransaction;
113: transaction.setContext(this );
114: }
115:
116: /* package */RAMTransaction getTransaction() {
117: return transaction;
118: }
119:
120: /* package */void setTransaction(RAMTransaction transaction) {
121: this.transaction = transaction;
122: }
123: }
|