/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2008-2009 Sun Microsystems, Inc.
|
*/
|
package org.opends.server.backends.ndb;
|
|
import com.mysql.cluster.ndbj.Ndb;
|
import com.mysql.cluster.ndbj.NdbApiException;
|
import com.mysql.cluster.ndbj.NdbOperation.AbortOption;
|
import com.mysql.cluster.ndbj.NdbTransaction;
|
import com.mysql.cluster.ndbj.NdbTransaction.ExecType;
|
|
|
/**
|
* This class represents abstract transaction.
|
*/
|
public class AbstractTransaction {
|
|
private Ndb ndb;
|
|
private NdbTransaction ndbTxn;
|
|
private NdbTransaction ndbDATxn;
|
|
private RootContainer rootContainer;
|
|
/**
|
* Default constructor.
|
* @param rootContainer root container to associate transaction with.
|
*/
|
public AbstractTransaction(RootContainer rootContainer) {
|
this.ndb = null;
|
this.ndbTxn = null;
|
this.ndbDATxn = null;
|
this.rootContainer = rootContainer;
|
}
|
|
/**
|
* Get Ndb handle associated with this abstract transaction.
|
* @return Ndb handle.
|
*/
|
public Ndb getNdb()
|
{
|
if (ndb == null) {
|
ndb = rootContainer.getNDB();
|
}
|
|
return ndb;
|
}
|
|
/**
|
* Get transaction.
|
* @return A transaction handle.
|
* @throws NdbApiException If an error occurs while attempting to begin
|
* a new transaction.
|
*/
|
public NdbTransaction getNdbTransaction()
|
throws NdbApiException
|
{
|
if (ndb == null) {
|
ndb = rootContainer.getNDB();
|
}
|
if (ndbTxn == null) {
|
ndbTxn = ndb.startTransaction();
|
}
|
|
return ndbTxn;
|
}
|
|
/**
|
* Get DA transaction.
|
* @param tableName table name for DA.
|
* @param partitionKey partition key for DA.
|
* @return A transaction handle.
|
* @throws NdbApiException If an error occurs while attempting to begin
|
* a new transaction.
|
*/
|
public NdbTransaction
|
getNdbDATransaction(String tableName, long partitionKey)
|
throws NdbApiException
|
{
|
if (ndb == null) {
|
ndb = rootContainer.getNDB();
|
}
|
if (ndbDATxn == null) {
|
ndbDATxn = ndb.startTransactionBig(tableName, partitionKey);
|
}
|
|
return ndbDATxn;
|
}
|
|
/**
|
* Commit transaction.
|
* @throws NdbApiException If an error occurs while attempting to commit
|
* the transaction.
|
*/
|
public void commit()
|
throws NdbApiException {
|
try {
|
if (ndbDATxn != null) {
|
try {
|
ndbDATxn.execute(ExecType.Commit, AbortOption.AbortOnError, true);
|
} finally {
|
if (ndbDATxn != null) {
|
ndbDATxn.close();
|
}
|
}
|
}
|
if (ndbTxn != null) {
|
try {
|
ndbTxn.execute(ExecType.Commit, AbortOption.AbortOnError, true);
|
} finally {
|
if (ndbTxn != null) {
|
ndbTxn.close();
|
}
|
}
|
}
|
} finally {
|
if (ndb != null) {
|
rootContainer.releaseNDB(ndb);
|
}
|
ndbDATxn = null;
|
ndbTxn = null;
|
ndb = null;
|
}
|
}
|
|
/**
|
* Execute transaction.
|
* @throws NdbApiException If an error occurs while attempting to execute
|
* the transaction.
|
*/
|
public void execute()
|
throws NdbApiException {
|
if (ndbDATxn != null) {
|
ndbDATxn.execute(ExecType.NoCommit, AbortOption.AbortOnError, true);
|
}
|
if (ndbTxn != null) {
|
ndbTxn.execute(ExecType.NoCommit, AbortOption.AbortOnError, true);
|
}
|
}
|
|
/**
|
* Close transaction.
|
* @throws NdbApiException If an error occurs while attempting to close the
|
* transaction.
|
*/
|
public void close()
|
throws NdbApiException {
|
try {
|
if (ndbDATxn != null) {
|
ndbDATxn.close();
|
}
|
if (ndbTxn != null) {
|
ndbTxn.close();
|
}
|
} finally {
|
if (ndb != null) {
|
rootContainer.releaseNDB(ndb);
|
}
|
ndbDATxn = null;
|
ndbTxn = null;
|
ndb = null;
|
}
|
}
|
}
|