/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.jini.core.transaction.server;
import net.jini.core.transaction.*;
import net.jini.core.lease.LeaseDeniedException;
import java.rmi.RemoteException;
/**
* The interface used for managers of the two-phase commit protocol for
* nestable transactions. All nestable transactions must have a
* transaction manager that runs this protocol.
*
* @author Sun Microsystems, Inc.
*
* @see NestableServerTransaction
* @see TransactionParticipant
*
* @since 1.0
*/
public interface NestableTransactionManager extends TransactionManager {
/**
* Begin a nested transaction, with the specified transaction as parent.
*
* @param parentMgr the manager of the parent transaction
* @param parentID the id of the parent transaction
* @param lease the requested lease time for the transaction
* @return the created transaction and the lease granted
*
* @throws UnknownTransactionException if the transaction
* is unknown to the transaction manager, either
* because the transaction ID is incorrect or because the
* transaction is complete and its state has been
* discarded by the manager.
* @throws CannotJoinException if the transaction is known
* to the manager but is no longer active.
* @throws LeaseDeniedException if this manager is unwilling to
* grant the requested lease time
* @throws RemoteException if there is a communication error
*
*/
TransactionManager.Created create(NestableTransactionManager parentMgr,
long parentID, long lease)
throws UnknownTransactionException, CannotJoinException,
LeaseDeniedException, RemoteException;
/**
* Promote the listed participants into the specified transaction.
* This method is for use by the manager of a subtransaction when the
* subtransaction commits. At this point, all participants of the
* subtransaction must become participants in the parent transaction.
* Prior to this point, the subtransaction's manager was a participant
* of the parent transaction, but after a successful promotion it need
* no longer be one (if it was not itself a participant of the
* subtransaction), and so it may specify itself as a participant to
* drop from the transaction. Otherwise, participants should not be
* dropped out of transactions. For each promoted participant, the
* participant's crash count is stored in the corresponding element of
* the <code>crashCounts</code> array.
*
* @param id the id of the parent transaction
* @param parts the participants being promoted to the parent
* @param crashCounts the crash counts of the participants
* @param drop the manager to drop out, if any
*
* @throws CrashCountException if the crash count provided
* for at least one participant differs from the crash
* count in a previous invocation of the same pairing
* of participant and transaction
* @throws UnknownTransactionException if a transaction
* is unknown to the transaction manager, either
* because the transaction ID is incorrect or because the
* transaction is complete and its state has been
* discarded by the manager.
* @throws CannotJoinException if a transaction is known
* to the manager but is no longer active.
* @throws RemoteException if there is a communication error
* @see TransactionManager#join
*/
void promote(long id, TransactionParticipant[] parts,
long[] crashCounts, TransactionParticipant drop)
throws UnknownTransactionException, CannotJoinException,
CrashCountException, RemoteException;
}