Example usage for javax.transaction.xa XAResource rollback

List of usage examples for javax.transaction.xa XAResource rollback

Introduction

In this page you can find the example usage for javax.transaction.xa XAResource rollback.

Prototype

void rollback(Xid xid) throws XAException;

Source Link

Document

Informs the resource manager to roll back work done on behalf of a transaction branch.

Usage

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public boolean createDatabaseByDistributeTransaction(Database db) throws MetaException {
    if (db.getMetastore() == null) {
        String slaveURL = getSegmentUrlByDbNameHashCode(db.getName());
        db.setMetastore(slaveURL);/*from   www .  j av  a  2 s .c o  m*/
    }
    int hashcode = getHashForDb(db.getName());
    db.setName(db.getName().toLowerCase());

    boolean success = false;

    Connection masterConn = null;
    Connection slaveConn = null;

    PGXADataSource masterDS = null;
    PGXADataSource slaveDS = null;

    masterDS = getXADataSource(globalDbUrl, user, passwd);
    slaveDS = getXADataSource(db.getMetastore(), user, passwd);

    XAConnection masterDSXaConn = null;
    XAConnection slaveDSXaConn = null;

    XAResource masterSaRes = null;
    XAResource slaveSaRes = null;

    int formatID = genFormatID();
    Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 });
    Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 });

    PreparedStatement masterStmt = null;
    PreparedStatement slaveStmt = null;

    try {
        masterDSXaConn = masterDS.getXAConnection();
        slaveDSXaConn = slaveDS.getXAConnection();

        masterSaRes = masterDSXaConn.getXAResource();
        slaveSaRes = slaveDSXaConn.getXAResource();

        masterConn = masterDSXaConn.getConnection();
        slaveConn = slaveDSXaConn.getConnection();

        masterStmt = masterConn
                .prepareStatement("insert into router(db_name, seg_addr,hashcode, owner) values(?,?,?,?)");
        slaveStmt = slaveConn
                .prepareStatement("insert into dbs(name, hdfs_schema, description, owner) VALUES(?,?,?,?)");

        try {
            masterSaRes.start(masterXid, XAResource.TMNOFLAGS);

            masterStmt.setString(1, db.getName());
            masterStmt.setString(2, db.getMetastore());
            masterStmt.setInt(3, hashcode);
            masterStmt.setString(4, db.getOwner());
            masterStmt.executeUpdate();

            masterSaRes.end(masterXid, XAResource.TMSUCCESS);

            slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS);

            slaveStmt.setString(1, db.getName());
            slaveStmt.setString(2, db.getHdfsscheme());
            slaveStmt.setString(3, db.getDescription());
            slaveStmt.setString(4, db.getOwner());
            slaveStmt.executeUpdate();

            slaveSaRes.end(slaveXid, XAResource.TMSUCCESS);

            int masterRet = masterSaRes.prepare(masterXid);
            int slaveRet = slaveSaRes.prepare(slaveXid);

            Warehouse wh = new Warehouse(hiveConf);
            Path databasePath = wh.getDefaultDatabasePath(db.getName(), db.getHdfsscheme());

            if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK && wh.mkdirs(databasePath)) {
                masterSaRes.commit(masterXid, false);
                slaveSaRes.commit(slaveXid, false);

                success = true;
            }
        } catch (XAException e) {
            LOG.error("XAException create database error, db=" + db.getName() + ", msg=" + e.getMessage());
            e.printStackTrace();
            throw new MetaException(e.getMessage());
        }
    } catch (SQLException e) {
        LOG.error("SQLException create database error, db=" + db.getName() + ", msg=" + e.getMessage());
        e.printStackTrace();
        throw new MetaException(e.getMessage());
    } finally {
        if (!success) {
            try {
                masterSaRes.rollback(masterXid);
            } catch (Exception x) {

            }

            try {
                slaveSaRes.rollback(slaveXid);
            } catch (Exception x) {

            }
        }

        closeStatement(masterStmt);
        closeStatement(slaveStmt);

        closeConnection(masterConn);
        closeConnection(slaveConn);

        closeXAConnection(masterDSXaConn);
        closeXAConnection(slaveDSXaConn);
    }

    return success;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public boolean dropDatabaseByDistributeTransaction(String name) throws MetaException {
    boolean success = false;
    name = name.toLowerCase();/*from  w  ww.  j  a  v a2  s  .c om*/
    Connection masterConn = null;
    Connection slaveConn = null;

    PGXADataSource masterDS = null;
    PGXADataSource slaveDS = null;

    masterDS = getXADataSource(globalDbUrl, user, passwd);

    String slaveURL = getSegmentDBURL(name);
    slaveDS = getXADataSource(slaveURL, user, passwd);

    XAConnection masterDSXaConn = null;
    XAConnection slaveDSXaConn = null;

    int formatID = genFormatID();
    Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 });
    Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 });

    XAResource masterSaRes = null;
    XAResource slaveSaRes = null;
    Statement masterStmt = null;
    Statement slaveStmt = null;

    try {
        masterDSXaConn = masterDS.getXAConnection();
        slaveDSXaConn = slaveDS.getXAConnection();

        masterSaRes = masterDSXaConn.getXAResource();
        slaveSaRes = slaveDSXaConn.getXAResource();

        masterConn = masterDSXaConn.getConnection();
        slaveConn = slaveDSXaConn.getConnection();

        masterStmt = masterConn.createStatement();
        slaveStmt = slaveConn.createStatement();

        try {
            masterSaRes.start(masterXid, XAResource.TMNOFLAGS);
            masterStmt.executeUpdate("delete from router where db_name='" + name + "'");
            masterStmt.executeUpdate("delete from dbpriv where db_name='" + name + "'");
            masterStmt.executeUpdate("delete from tblpriv where db_name='" + name + "'");
            masterSaRes.end(masterXid, XAResource.TMSUCCESS);

            slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS);
            slaveStmt.executeUpdate("delete from dbs where name='" + name + "'");
            slaveSaRes.end(slaveXid, XAResource.TMSUCCESS);

            int masterRet = masterSaRes.prepare(masterXid);
            int slaveRet = slaveSaRes.prepare(slaveXid);

            Warehouse wh = new Warehouse(hiveConf);

            if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK
                    && wh.deleteDir(wh.getDefaultDatabasePath(name), true)) {
                masterSaRes.commit(masterXid, false);
                slaveSaRes.commit(slaveXid, false);

                success = true;
            }
        } catch (XAException e) {
            LOG.error("drop database error, db=" + name + ", msg=" + e.getMessage());
            throw new MetaException(e.getMessage());
        }
    } catch (Exception e) {
        LOG.error("create database error, db=" + name + ", msg=" + e.getMessage());
        throw new MetaException(e.getMessage());
    } finally {
        if (!success) {
            try {
                masterSaRes.rollback(masterXid);
            } catch (Exception x) {

            }

            try {
                slaveSaRes.rollback(slaveXid);
            } catch (Exception x) {

            }
        }

        closeStatement(masterStmt);
        closeStatement(slaveStmt);

        closeConnection(masterConn);
        closeConnection(slaveConn);

        closeXAConnection(masterDSXaConn);
        closeXAConnection(slaveDSXaConn);
    }

    if (success) {
        Statement stmt = null;
        Connection con = null;
        try {
            con = getGlobalConnection();
            stmt = con.createStatement();
            String sql = "delete from dbsensitivity where db_name='" + name + "'";
            stmt.executeUpdate(sql);

            sql = "delete from tblsensitivity where db_name='" + name + "'";
            stmt.executeUpdate(sql);
        } catch (Exception e1) {
            LOG.error("update tblsenstivity table error, db=" + name + ", msg=" + e1.getMessage());
        } finally {
            closeStatement(stmt);
            closeConnection(con);
        }
    }

    return success;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void renameTableByDistributeTrans(String dbName, String tblName, String modifyUser, String newName)
        throws InvalidOperationException, MetaException {
    dbName = dbName.toLowerCase();//www. j  a  v a  2 s.c o m
    tblName = tblName.toLowerCase();
    modifyUser = modifyUser.toLowerCase();
    newName = newName.toLowerCase();

    boolean success = false;

    Connection masterConn = null;
    Connection slaveConn = null;

    PGXADataSource masterDS = null;
    PGXADataSource slaveDS = null;

    String slaveUrl = getSegmentDBURL(dbName);

    masterDS = getXADataSource(globalDbUrl, user, passwd);
    slaveDS = getXADataSource(slaveUrl, user, passwd);

    XAConnection masterDSXaConn = null;
    XAConnection slaveDSXaConn = null;

    XAResource masterSaRes = null;
    XAResource slaveSaRes = null;

    int formatID = genFormatID();
    Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 });
    Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 });

    Statement masterStmt = null;
    Statement slaveStmt = null;

    boolean isMoved = false;
    Path newPath = null;
    Path oldPath = null;
    FileSystem oldFs = null;
    FileSystem newFs = null;
    Warehouse wh = null;
    String newLocation = null;

    try {
        masterDSXaConn = masterDS.getXAConnection();
        slaveDSXaConn = slaveDS.getXAConnection();

        masterSaRes = masterDSXaConn.getXAResource();
        slaveSaRes = slaveDSXaConn.getXAResource();

        masterConn = masterDSXaConn.getConnection();
        slaveConn = slaveDSXaConn.getConnection();

        masterStmt = masterConn.createStatement();
        slaveStmt = slaveConn.createStatement();

        try {
            masterSaRes.start(masterXid, XAResource.TMNOFLAGS);
            String sql = "update tblpriv set tbl_name='" + newName + "' where db_name='" + dbName
                    + "' and tbl_name='" + tblName + "'";
            masterStmt.executeUpdate(sql);

            masterSaRes.end(masterXid, XAResource.TMSUCCESS);

            slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS);

            sql = "select tbl_id, tbl_type, tbl_location, serde_lib from tbls " + "where db_name='" + dbName
                    + "' and tbl_name='" + tblName + "'";

            boolean isTblFind = false;
            long tblID = 0;
            ResultSet tblSet = slaveStmt.executeQuery(sql);
            String tblType = null;
            String oldLocation = null;
            String serdeLib = null;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                oldLocation = tblSet.getString(3);
                serdeLib = tblSet.getString(4);
                break;
            }
            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                throw new MetaException("only manage table can rename ");
            }

            if (serdeLib.equals(ProtobufSerDe.class.getName())) {
                throw new MetaException(
                        "Renaming table is not supported for protobuf table. SerDe may be incompatible");
            }

            Map<String, String> tblParamMap = new HashMap<String, String>();
            sql = "select param_key, param_value from table_params where tbl_id=" + tblID
                    + " and param_type='TBL'";
            ResultSet paramSet = slaveStmt.executeQuery(sql);
            while (paramSet.next()) {
                tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
            }
            paramSet.close();

            boolean containTime = false;
            boolean contailUser = false;
            if (tblParamMap.containsKey("last_modified_time"))
                containTime = true;
            if (tblParamMap.containsKey("last_modified_by"))
                contailUser = true;

            if (containTime && contailUser) {
                slaveStmt.executeUpdate("update table_params set param_value='"
                        + String.valueOf(System.currentTimeMillis() / 1000) + "' where tbl_id=" + tblID
                        + " and param_type='TBL' and param_key='last_modified_time'");

                slaveStmt.executeUpdate("update table_params set param_value='" + modifyUser + "' where tbl_id="
                        + tblID + " and param_type='TBL' and param_key='last_modified_by'");
            } else if (!containTime && !contailUser) {
                slaveStmt.executeUpdate(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID
                                + ", 'TBL', 'last_modified_time', '"
                                + String.valueOf(System.currentTimeMillis() / 1000) + "')");

                slaveStmt.executeUpdate(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID
                                + ", 'TBL', 'last_modified_by', '" + modifyUser + "')");
            } else if (containTime && !contailUser) {
                slaveStmt.executeUpdate("update table_params set param_value='"
                        + String.valueOf(System.currentTimeMillis() / 1000) + "' where tbl_id=" + tblID
                        + " and param_type='TBL' and param_key='last_modified_time'");

                slaveStmt.executeUpdate(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID
                                + ", 'TBL', 'last_modified_by', '" + modifyUser + "')");
            } else {
                slaveStmt.executeUpdate(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID
                                + ", 'TBL', 'last_modified_time', '"
                                + String.valueOf(System.currentTimeMillis() / 1000) + "')");

                slaveStmt.executeUpdate("update table_params set param_value='" + modifyUser + "' where tbl_id="
                        + tblID + " and param_type='TBL' and param_key='last_modified_by'");
            }

            wh = new Warehouse(hiveConf);
            //        newLocation = wh.getDefaultTablePath(dbName, newName).toString();
            newLocation = oldLocation.substring(0, oldLocation.length() - tblName.length()) + newName;

            sql = "update tbls set tbl_name='" + newName + "', tbl_location='" + newLocation + "'"
                    + " where tbl_id=" + tblID;
            slaveStmt.executeUpdate(sql);

            slaveSaRes.end(slaveXid, XAResource.TMSUCCESS);

            int masterRet = masterSaRes.prepare(masterXid);
            int slaveRet = slaveSaRes.prepare(slaveXid);

            oldPath = new Path(oldLocation);
            oldFs = wh.getFs(oldPath);
            newPath = new Path(newLocation);
            newFs = wh.getFs(newPath);

            if (oldFs != newFs) {
                throw new InvalidOperationException(
                        "table new location " + oldFs + " is on a different file system than the old location "
                                + newFs + ". This operation is not supported");
            }

            try {
                oldFs.exists(oldPath);
                if (newFs.exists(newPath)) {
                    throw new InvalidOperationException("New location for this table " + dbName + "." + tblName
                            + " already exists : " + newPath);
                }

            } catch (IOException e) {

                throw new InvalidOperationException(
                        "Unable to access new location " + newPath + " for table " + dbName + "." + tblName);
            }

            try {
                if (oldFs.exists(oldPath)) {
                    oldFs.rename(oldPath, newPath);
                }
                isMoved = true;
            } catch (IOException e) {
                throw new InvalidOperationException(
                        "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName);

            }

            if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK) {
                masterSaRes.commit(masterXid, false);
                slaveSaRes.commit(slaveXid, false);

                success = true;
            }
        } catch (XAException e) {
            LOG.error("XAException rename table error, db=" + dbName + ", tbl=" + tblName + ", new tbl="
                    + newName + ", msg=" + e.getMessage());
            e.printStackTrace();
            throw new MetaException(e.getMessage());
        }
    } catch (SQLException e) {
        LOG.error("XAException rename table error, db=" + dbName + ", tbl=" + tblName + ", new tbl=" + newName
                + ", msg=" + e.getMessage());
        e.printStackTrace();
        throw new MetaException(e.getMessage());
    } finally {
        if (!success) {
            try {
                masterSaRes.rollback(masterXid);
            } catch (Exception x) {

            }

            try {
                slaveSaRes.rollback(slaveXid);
            } catch (Exception x) {

            }
            if (isMoved) {
                try {
                    if (oldFs.exists(oldPath)) {
                        oldFs.rename(newPath, oldPath);
                    }

                } catch (IOException e) {
                    throw new InvalidOperationException("Unable to access old location " + oldPath
                            + " for table " + dbName + "." + tblName);

                }
            }
        }

        closeStatement(masterStmt);
        closeStatement(slaveStmt);

        closeConnection(masterConn);
        closeConnection(slaveConn);

        closeXAConnection(masterDSXaConn);
        closeXAConnection(slaveDSXaConn);
    }

    if (success) {
        Statement stmt = null;
        Connection con = null;
        try {
            con = getGlobalConnection();
            stmt = con.createStatement();
            String sql = "update tblsensitivity set tbl_name='" + newName + "' where db_name='" + dbName
                    + "' and tbl_name='" + tblName + "'";

            stmt.executeUpdate(sql);
        } catch (Exception e1) {
            LOG.error("update tblsenstivity table error, db=" + dbName + ", tbl=" + tblName + ", msg="
                    + e1.getMessage());
        } finally {
            closeStatement(stmt);
            closeConnection(con);
        }
    }
}

From source file:org.eclipse.ecr.core.storage.sql.TestSQLBackend.java

public void testRollback() throws Exception {
    Session session = repository.getConnection();
    XAResource xaresource = ((SessionImpl) session).getXAResource();
    Node root = session.getRootNode();
    Node nodea = session.addChildNode(root, "foo", null, "TestDoc", false);
    nodea.setSimpleProperty("tst:title", "old");
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());
    session.save();//from w w w .j  a  v a2 s . c  o m

    /*
     * rollback before save (underlying XAResource saw no updates)
     */
    Xid xid = new XidImpl("1");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    nodea = session.getNodeByPath("/foo", null);
    nodea.setSimpleProperty("tst:title", "new");
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.rollback(xid);
    nodea = session.getNodeByPath("/foo", null);
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());

    /*
     * rollback after save (underlying XAResource does a rollback too)
     */
    xid = new XidImpl("2");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    nodea = session.getNodeByPath("/foo", null);
    nodea.setSimpleProperty("tst:title", "new");
    session.save();
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.rollback(xid);
    nodea = session.getNodeByPath("/foo", null);
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());
}

From source file:org.eclipse.ecr.core.storage.sql.TestSQLBackend.java

public void testSaveOnCommit() throws Exception {
    Session session = repository.getConnection(); // init
    session.save();//from   ww  w  . j  a  v a 2 s  . com

    XAResource xaresource = ((SessionImpl) session).getXAResource();

    // first transaction
    Xid xid = new XidImpl("1");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    Node root = session.getRootNode();
    assertNotNull(root);
    session.addChildNode(root, "foo", null, "TestDoc", false);
    // let end do an implicit save
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.commit(xid, false);

    // should have saved, clearing caches should be harmless
    ((SessionImpl) session).clearCaches();

    // second transaction
    xid = new XidImpl("2");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    Node foo = session.getNodeByPath("/foo", null);
    assertNotNull(foo);
    xaresource.end(xid, XAResource.TMSUCCESS);
    int outcome = xaresource.prepare(xid);
    if (outcome == XAResource.XA_OK) {
        // Derby doesn't allow rollback if prepare returned XA_RDONLY
        xaresource.rollback(xid);
    }
}

From source file:org.nuxeo.ecm.core.storage.sql.TestSQLBackend.java

protected static void rollback(Session session, Xid xid) throws XAException {
    XAResource xaresource = ((SessionImpl) session).getXAResource();
    boolean rollback = true;
    try {//  www. j  a  va 2 s  .co  m
        xaresource.end(xid, XAResource.TMFAIL);
    } catch (XAException e) {
        if (e.errorCode == XAException.XA_RBROLLBACK // Derby
                || e.errorCode == XAException.XA_RBDEADLOCK // Derby
                || e.getMessage().startsWith("XA_RBDEADLOCK") // MySQL
        ) {
            rollback = false;
        } else {
            throw e;
        }
    }
    if (rollback) {
        xaresource.rollback(xid);
    }
}

From source file:org.nuxeo.ecm.core.storage.sql.TestSQLBackend.java

@Test
public void testRollback() throws Exception {
    if (!DatabaseHelper.DATABASE.supportsXA()) {
        return;/*from ww w  . ja v a2s .c  o  m*/
    }

    Session session = repository.getConnection();
    XAResource xaresource = ((SessionImpl) session).getXAResource();
    Node root = session.getRootNode();
    Node nodea = session.addChildNode(root, "foo", null, "TestDoc", false);
    nodea.setSimpleProperty("tst:title", "old");
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());
    session.save();

    /*
     * rollback before save (underlying XAResource saw no updates)
     */
    Xid xid = new XidImpl("11111111111111111111111111111111");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    nodea = session.getNodeByPath("/foo", null);
    nodea.setSimpleProperty("tst:title", "new");
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.rollback(xid);
    nodea = session.getNodeByPath("/foo", null);
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());

    /*
     * rollback after save (underlying XAResource does a rollback too)
     */
    xid = new XidImpl("22222222222222222222222222222222");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    nodea = session.getNodeByPath("/foo", null);
    nodea.setSimpleProperty("tst:title", "new");
    session.save();
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.rollback(xid);
    nodea = session.getNodeByPath("/foo", null);
    assertEquals("old", nodea.getSimpleProperty("tst:title").getString());
}

From source file:org.nuxeo.ecm.core.storage.sql.TestSQLBackend.java

@Test
public void testSaveOnCommit() throws Exception {
    if (!DatabaseHelper.DATABASE.supportsXA()) {
        return;/*from  w w  w .j  a v a2  s .c  om*/
    }

    Session session = repository.getConnection(); // init
    session.save();

    XAResource xaresource = ((SessionImpl) session).getXAResource();

    // first transaction
    Xid xid = new XidImpl("11111111111111111111111111111111");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    Node root = session.getRootNode();
    assertNotNull(root);
    session.addChildNode(root, "foo", null, "TestDoc", false);
    // let end do an implicit save
    xaresource.end(xid, XAResource.TMSUCCESS);
    xaresource.prepare(xid);
    xaresource.commit(xid, false);

    // should have saved, clearing caches should be harmless
    ((SessionImpl) session).clearCaches();

    // second transaction
    xid = new XidImpl("22222222222222222222222222222222");
    xaresource.start(xid, XAResource.TMNOFLAGS);
    Node foo = session.getNodeByPath("/foo", null);
    assertNotNull(foo);
    xaresource.end(xid, XAResource.TMSUCCESS);
    int outcome = xaresource.prepare(xid);
    if (outcome == XAResource.XA_OK) {
        // Derby doesn't allow rollback if prepare returned XA_RDONLY
        xaresource.rollback(xid);
    }
}

From source file:org.seasar.karrta.jcr.intercepter.JcrTransactionInterceptor.java

public Object invoke(MethodInvocation invocation) throws Throwable {
    Thread currentThread = Thread.currentThread();
    if (this.sessionManager_.isExist(currentThread)) {
        return invocation.proceed();
    }/*  w w w  .  j  a  v  a2  s  .  c  o  m*/

    logger_.debug("::: [Begin Transaction] ::: [" + currentThread + "] :::");

    // check in jcr-session.
    XASession session = (XASession) sessionManager_.borrowObject(currentThread);
    Xid xid = new Xid() {
        public byte[] getBranchQualifier() {
            return new byte[0];
        }

        public int getFormatId() {
            return 0;
        }

        public byte[] getGlobalTransactionId() {
            return new byte[0];
        }
    };
    XAResource xares = session.getXAResource();
    xares.start(xid, XAResource.TMNOFLAGS);

    Object result = null;
    try {
        for (Method m : invocation.getThis().getClass().getMethods()) {
            if ("setOcmQueryManager".equals(m.getName())) {
                m.invoke(invocation.getThis(), this.ocmFactory.getQueryManager());
            }
            if ("setQueryManager".equals(m.getName())) {
                m.invoke(invocation.getThis(), session.getWorkspace().getQueryManager());
            }
        }
        result = invocation.proceed();

        xares.end(xid, XAResource.TMSUCCESS);
        xares.prepare(xid);
        xares.commit(xid, false);

    } catch (Exception e) {
        e.printStackTrace();
        xares.rollback(xid);

    } finally {
        // check out jcr-session.
        this.sessionManager_.returnSession(currentThread, session);
        logger_.debug("::: [End Transaction] ::: [" + currentThread + "] :::");
    }
    return result;
}