/*
* 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.UnknownTransactionException;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* The interface used for participants of the two-phase commit protocol.
* The methods on this interface are called by the transaction manager.
* Any class that wants to have operations wrapped in a transaction
* needs to support this interface. In conjunction with the
* <code>TransactionManager</code> interface, this interface allows a
* two-phase commit protocol to be used between objects in a distributed
* system.
*
* @author Sun Microsystems, Inc.
*
* @see TransactionManager
* @see NestableTransactionManager
* @see ServerTransaction
*
* @since 1.0
*/
public interface TransactionParticipant extends Remote, TransactionConstants {
/**
* Requests that the participant prepare itself to commit the transaction,
* and to vote on the outcome of the transaction. The participant responds
* with either <code>PREPARED</code>, indicating that it is prepared;
* <code>ABORT</code>, indicating that it will abort, or
* <code>NOTCHANGED</code>, indicating that it did not have any state
* changed by the transaction (i.e., it was read-only). If the response
* is <code>PREPARED</code>, the participant must wait until it receives
* a commit or abort call from the transaction manager; it may query the
* transaction manager if needed as to the state of the transaction. If
* the response is <code>ABORT</code>, the participant should roll its
* state back to undo any changes that occurred due to operations
* performed under the transaction; it can then discard any information
* about the transaction. If the response is <code>NOTCHANGED</code>, the
* participant can immediately discard any knowledge of the transaction.
*
* @param mgr the manager of the transaction
* @param id the transaction ID
*
* @return an <code>int</code> representing this participant's state
* @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 RemoteException if there is a communication error
*
*/
int prepare(TransactionManager mgr, long id)
throws UnknownTransactionException, RemoteException;
/**
* Requests that the participant make all of its <code>PREPARED</code>
* changes for the specified transaction visible outside of the
* transaction and unlock any resources locked by the transaction.
* All state associated with the transaction can then be discarded
* by the participant.
*
* @param mgr the manager of the transaction
* @param id the transaction ID
*
* @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 RemoteException if there is a communication error
*
*/
void commit(TransactionManager mgr, long id)
throws UnknownTransactionException, RemoteException;
/**
* Requests that the participant roll back any changes for the specified
* transaction and unlock any resources locked by the transaction.
* All state associated with the transaction can then be discarded
* by the participant.
*
* @param mgr the manager of the transaction
* @param id the transaction ID
*
* @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 RemoteException if there is a communication error
*
*/
void abort(TransactionManager mgr, long id)
throws UnknownTransactionException, RemoteException;
/**
* A combination of <code>prepare</code> and <code>commit</code>, which
* can be used by the manager when there is just one participant left to
* prepare and all other participants (if any) have responded with
* <code>NOTCHANGED</code>. The participant's implementation of this
* method must be equivalent to:
* <pre>
* public int prepareAndCommit(TransactionManager mgr, long id)
* throws UnknownTransactionException, RemoteException
* {
* int result = prepare(mgr, id);
* if (result == PREPARED) {
* commit(mgr, id);
* result = COMMITTED;
* }
* return result;
* }
* </pre>
*
* @param mgr the manager of the transaction
* @param id the transaction ID
*
* @return an <code>int</code> representing its state
* @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 RemoteException if there is a communication error
*
* @see #prepare
* @see #commit
*/
int prepareAndCommit(TransactionManager mgr, long id)
throws UnknownTransactionException, RemoteException;
}