blob: cd83bfd302abd20aac620d2a492e4bb1f01784d5 [file] [log] [blame]
/*
* 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.
*/
#ifndef _CMS_XARESOURCE_H_
#define _CMS_XARESOURCE_H_
#include <cms/Config.h>
#include <cms/Xid.h>
#include <cms/XAException.h>
namespace cms {
/**
* The XAResource interface is a CMS mapping of the industry standard XA interface based
* on the X/Open CAE Specification (Distributed Transaction Processing: The XA Specification).
*
* The XA interface defines the contract between a Resource Manager and a Transaction Manager
* in a distributed transaction processing (DTP) environment. A CMS provider implements this
* interface to support the association between a global transaction and a message broker
* connection.
*
* The XAResource is exposed to CMS client so that they can proxy calls from the Transaction
* Manager API of their choosing to the CMS provider. The CMS provider should behave and a
* standard XA Resource Manager its up to the client however to transmit the Transaction
* Manager's calls to the CMS provider through this interface.
*
* @since 2.3
*/
class CMS_API XAResource {
public:
/**
* Flag to end a recovery scan
*/
static const int TMENDRSCAN;
/**
* Flag to indicate that the caller is dissociation from a transaction
* branch and that it should be marked rollback only
*/
static const int TMFAIL;
/**
* Flag to indicate that the caller is joining sn existing transaction
* branch.
*/
static const int TMJOIN;
/**
* Flag that indicates that no flags options are selected. (ie a null flag)
*/
static const int TMNOFLAGS;
/**
* Flag that indicates the caller is using one-phase commit optimization
*/
static const int TMONEPHASE;
/**
* Flag that indicates the caller is resuming association with a suspended
* transaction branch
*/
static const int TMRESUME;
/**
* Flag that indicates the start of a recovery scan
*/
static const int TMSTARTRSCAN;
/**
* Flag that indicates the caller is dissociating from a transaction branch
*/
static const int TMSUCCESS;
/**
* Flag that indicates that the caller is suspending (not terminating) its
* association with a transaction branch.
*/
static const int TMSUSPEND;
/**
* Flag that indicates that transaction work has been read only and has been
* committed normally
*/
static const int XA_RDONLY;
/**
* Flag that indicates that transaction work has been Prepared normally
*/
static const int XA_OK;
public:
virtual ~XAResource();
/**
* Commits a global transaction.
*
* @param xid
* the XID which identifies the global transaction.
* @param onePhase
* true if the resource manager should use a one-phase commit
* protocol to commit the transaction.
*
* @throws XAException
* if an error occurred.
* <p>
* Possible errors are identified by the errorcode in the
* XAException and include: XA_HEURHAZ, XA_HEURCOM, XA_HEURRB,
* XA_HEURMIX, XAER_RMERR, XAER_RMFAIL, XAER_NOTA, XAER_INVAL,
* or XAER_PROTO. In addition, one of the XA_RB* errors can
* occur if the transaction was not committed and onePhase
* was set to true. On completion of this method, the Resource
* Manager has rolled back the transaction and released
* resources held by the transaction.
*/
virtual void commit(const Xid* xid, bool onePhase) = 0;
/**
* Ends the work done for a transaction branch. The Resource Manager
* disconnects the XA resource from the transaction branch and allows the
* transaction to complete.
*
* @param xid
* the XID which identifies the global transaction. Should have
* previously been used as the parameter to a start.
* method.
* @param flags
* a flags integer - one of: XAResource::TMSUCCESS,
* XAResource::TMFAIL, or XAResource::TMSUSPEND.
* <p>
* TMSUCCESS means that this section of work completed
* successfully.
* <p>
* TMFAIL means that this section of work failed. The Resource
* Manager can mark the transaction for rollback only.
* <p>
* TMSUSPEND means that this section of work is suspended and not
* yet complete. The associated transaction context is also
* suspended and must be restarted with a call to
* {@link #start(Xid, int)} with the TMRESUME
* flag.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR, XAER_RMFAIL, XAER_NOTA,
* XAER_INVAL, XAER_PROTO, or XA_RB*.
*/
virtual void end(const Xid* xid, int flags) = 0;
/**
* Informs the Resource Manager that it can forget about a specified
* transaction branch.
*
* @param xid
* the XID which identifies the global transaction.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR, XAER_RMFAIL, XAER_NOTA,
* XAER_INVAL, or XAER_PROTO.
*/
virtual void forget(const Xid* xid) = 0;
/**
* Gets the transaction timeout value for this XAResource. The default
* timeout value is the default timeout value set for the Resource Manager.
*
* @return the transaction timeout value for this XAResource in seconds.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR and XAER_RMFAIL.
*/
virtual int getTransactionTimeout() const = 0;
/**
* Returns true if the ResourceManager for this XAResource is the same as
* the Resource Manager for a supplied XAResource.
*
* @param theXAResource
* an XAResource object
* @return true if the Resource Manager for this XAResource is the same as
* the Resource Manager for <code>theXAResource</code>.
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR and XAER_RMFAIL.
*/
virtual bool isSameRM(const XAResource* theXAResource) = 0;
/**
* Requests the Resource manager to prepare to commit a specified
* transaction.
*
* @param xid
* the XID which identifies the global transaction.
*
* @return an integer: XA_RDONLY or XA_OK. XA_OK implies that the
* transaction work has been prepared normally, XA_RDONLY implies
* that the transaction branch is read only and has been committed.
* If there is a failure which requires a rollback, an XAException
* is raised.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XA_RB*, XAER_RMERR, XAER_RMFAIL,
* XAER_NOTA, XAER_INVAL, or XAER_PROTO.
*/
virtual int prepare(const Xid* xid) = 0;
/**
* Get a list of prepared transaction branches.
*
* Typically used by a transaction manager during recovery to find
* transaction branches that are in prepared or heuristically completed
* states.
*
* @param flag
* an integer. Must be one of: XAResource::TMSTARTRSCAN,
* XAResource::TMENDRSCAN, XAResource::TMNOFLAGS.
*
* @return an array of zero or more XIDs identifying the transaction
* branches in the prepared or heuristically completed states.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR, XAER_RMFAIL, XAER_INVAL, and
* XAER_PROTO.
*/
virtual int recover(int flag, Xid** recovered) = 0;
/**
* Requests the Resource Manager to rollback a specified transaction branch.
*
* @param xid
* the XID which identifies the transaction branch.
*
* @throws XAException
* if an error occurs.
*/
virtual void rollback(const Xid* xid) = 0;
/**
* Sets the transaction timeout value for this XAResource. If the value is
* set to 0, the default timeout value for the Resource Manager is used.
*
* @param seconds
* the new Timeout value in seconds.
*
* @return true if the transaction timeout value has been updated, false
* otherwise.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XAER_RMERR, XAER_RMFAIL, or XAER_INVAL.
*/
virtual bool setTransactionTimeout(int seconds) = 0;
/**
* Starts work for a specified transaction branch.
*
* @param xid
* the XID which identifies the transaction branch.
* @param flags
* an integer. Must be one of XAResource::TMNOFLAGS,
* XAResource::TMJOIN, or XAResource::TMRESUME.
* <p>
* TMJOIN implies that the start applies to joining a transaction
* previously passed to the Resource Manager.
* <p>
* TMRESUME implies that the start applies to a suspended
* transaction that should be restarted.
* <p>
* If TMNOFLAGS is specified, then if the transaction has been
* previously seen by the Resource Manager, an XAException is
* raised with the code XAER_DUPID.
*
* @throws XAException
* if an error occurs. Possible error identified in the
* errorcode include: XA_RB*, XAER_RMERR, XAER_RMFAIL,
* XAER_DUPID, XAER_OUTSIDE, XAER_NOTA, XAER_INVAL, or
* XAER_PROTO.
*/
virtual void start(const Xid* xid, int flags) = 0;
};
}
#endif /* _CMS_XARESOURCE_H_ */