Example usage for javax.transaction.xa XAResource prepare

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

Introduction

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

Prototype

int prepare(Xid xid) throws XAException;

Source Link

Document

Ask the resource manager to prepare for a transaction commit of the transaction specified in xid.

Usage

From source file:org.apache.activemq.bugs.AMQ7067Test.java

protected static void createDanglingTransaction(XAResource xaRes, XASession xaSession, Queue queue)
        throws JMSException, IOException, XAException {
    MessageProducer producer = xaSession.createProducer(queue);
    XATransactionId txId = createXATransaction();
    xaRes.start(txId, TMNOFLAGS);/*from w  w  w  .j a  va2s.c  o m*/

    TextMessage helloMessage = xaSession.createTextMessage(StringUtils.repeat("dangler", 10));
    producer.send(helloMessage);
    xaRes.end(txId, TMSUCCESS);
    xaRes.prepare(txId);
    System.out.println("****** createDanglingTransaction txId = " + txId);
}

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   w  w w  . j  a va 2s  . 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 www.j  a v  a 2s .  co m*/
    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();/* ww w .  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.apache.hadoop.hive.metastore.MyXid.java

public boolean dropUserByDistributeTransaction(String userName) throws NoSuchObjectException, MetaException {

    boolean success = false;

    Connection masterConn = null;

    PGXADataSource masterDS = null;/*from   ww w  . jav  a 2  s.co  m*/

    masterDS = getXADataSource(globalDbUrl, user, passwd);

    Set<String> slaveURLSet = getAllSegments();
    int size = slaveURLSet.size();

    PGXADataSource[] slaveDSArray = new PGXADataSource[size];
    XAConnection[] slaveDSXaConnArray = new XAConnection[size];
    XAResource[] slaveSaResArray = new XAResource[size];
    Connection[] slaveConArray = new Connection[size];
    Statement[] slaveStmtArray = new Statement[size];
    Xid[] slaveXidArray = new Xid[size];

    int index = 0;
    for (String slaveURL : slaveURLSet) {
        slaveDSArray[index] = getXADataSource(slaveURL, user, passwd);
        index++;
    }

    XAConnection masterDSXaConn = null;

    int formatID = genFormatID();

    try {
        masterDSXaConn = masterDS.getXAConnection();

        for (int i = 0; i < size; i++) {
            slaveDSXaConnArray[i] = slaveDSArray[i].getXAConnection();
            slaveSaResArray[i] = slaveDSXaConnArray[i].getXAResource();
            slaveConArray[i] = slaveDSXaConnArray[i].getConnection();
            slaveStmtArray[i] = slaveConArray[i].createStatement();

            byte id1 = (byte) ((i + 2) * 2);
            byte id2 = (byte) (id1 + 1);

            slaveXidArray[i] = new MyXid(formatID, new byte[] { id1 }, new byte[] { id2 });
        }

        XAResource masterSaRes = masterDSXaConn.getXAResource();
        masterConn = masterDSXaConn.getConnection();
        Statement masterStmt = masterConn.createStatement();
        Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 });

        try {
            masterSaRes.start(masterXid, XAResource.TMNOFLAGS);
            masterStmt.executeUpdate("delete from tdwuser where user_name='" + userName.toLowerCase() + "'");
            masterSaRes.end(masterXid, XAResource.TMSUCCESS);

            for (int i = 0; i < size; i++) {
                slaveSaResArray[i].start(slaveXidArray[i], XAResource.TMNOFLAGS);
                slaveStmtArray[i]
                        .executeUpdate("delete from dbpriv where user_name='" + userName.toLowerCase() + "'");
                slaveStmtArray[i]
                        .executeUpdate("delete from tblpriv where user_name='" + userName.toLowerCase() + "'");
                slaveSaResArray[i].end(slaveXidArray[i], XAResource.TMSUCCESS);
            }

            boolean isAllPred = true;
            int masterRet = masterSaRes.prepare(masterXid);

            if (masterRet == XAResource.XA_OK) {
                int[] slaveRetArray = new int[size];
                for (int i = 0; i < size; i++) {
                    slaveRetArray[i] = slaveSaResArray[i].prepare(slaveXidArray[i]);

                    if (slaveRetArray[i] == XAResource.XA_OK) {
                        continue;
                    } else {
                        isAllPred = false;
                        break;
                    }
                }

                if (isAllPred) {
                    masterSaRes.commit(masterXid, false);
                    for (int i = 0; i < size; i++) {
                        slaveSaResArray[i].commit(slaveXidArray[i], false);
                    }

                    success = true;
                }
            }
        } catch (XAException e) {
            LOG.error("drop user error, user=" + userName + ", msg=" + e.getMessage());
            throw new MetaException(e.getMessage());
        }
    } catch (SQLException e) {
        LOG.error("drop user error, user=" + userName + ", msg=" + e.getMessage());
        throw new MetaException(e.getMessage());
    } finally {
        closeConnection(masterConn);
        closeXAConnection(masterDSXaConn);

        for (int i = 0; i < size; i++) {
            closeConnection(slaveConArray[i]);
            closeXAConnection(slaveDSXaConnArray[i]);
        }
    }

    return success;
}

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

public boolean dropRoleByDistributeTransaction(String roleName) throws MetaException, NoSuchObjectException {

    Connection con = null;//from   w w  w  . java  2s .  c  om
    ;
    PreparedStatement ps = null;
    boolean success = false;
    roleName = roleName.toLowerCase();

    try {
        con = getGlobalConnection();
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop role error, role=" + roleName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop role error, role=" + roleName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select role_name from tdwrole where role_name=?");
        ps.setString(1, roleName.toLowerCase());

        boolean isRoleFind = false;
        ResultSet roleSet = ps.executeQuery();
        while (roleSet.next()) {
            isRoleFind = true;
            break;
        }

        if (!isRoleFind) {
            throw new NoSuchObjectException("can not find role:" + roleName);
        }

        con.commit();
        success = true;
    } catch (SQLException sqlex) {
        LOG.error("drop role error, role=" + roleName + ", msg=" + sqlex.getMessage());
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    success = false;

    Connection masterConn = null;
    PGXADataSource masterDS = null;
    masterDS = getXADataSource(globalDbUrl, user, passwd);

    Set<String> slaveURLSet = getAllSegments();
    int size = slaveURLSet.size();

    PGXADataSource[] slaveDSArray = new PGXADataSource[size];
    XAConnection[] slaveDSXaConnArray = new XAConnection[size];
    XAResource[] slaveSaResArray = new XAResource[size];
    Connection[] slaveConArray = new Connection[size];
    Statement[] slaveStmtArray = new Statement[size];
    Xid[] slaveXidArray = new Xid[size];

    int index = 0;
    for (String slaveURL : slaveURLSet) {
        slaveDSArray[index] = getXADataSource(slaveURL, user, passwd);
        index++;
    }

    XAConnection masterDSXaConn = null;

    int formatID = genFormatID();

    try {
        masterDSXaConn = masterDS.getXAConnection();

        for (int i = 0; i < size; i++) {
            slaveDSXaConnArray[i] = slaveDSArray[i].getXAConnection();
            slaveSaResArray[i] = slaveDSXaConnArray[i].getXAResource();
            slaveConArray[i] = slaveDSXaConnArray[i].getConnection();
            slaveStmtArray[i] = slaveConArray[i].createStatement();

            byte id1 = (byte) ((i + 2) * 2);
            byte id2 = (byte) (id1 + 1);

            slaveXidArray[i] = new MyXid(formatID, new byte[] { id1 }, new byte[] { id2 });
        }

        XAResource masterSaRes = masterDSXaConn.getXAResource();
        masterConn = masterDSXaConn.getConnection();
        Statement masterStmt = masterConn.createStatement();
        Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 });

        try {
            masterSaRes.start(masterXid, XAResource.TMNOFLAGS);
            masterStmt.executeUpdate("delete from tdwrole where role_name='" + roleName.toLowerCase() + "'");
            masterSaRes.end(masterXid, XAResource.TMSUCCESS);

            for (int i = 0; i < size; i++) {
                slaveSaResArray[i].start(slaveXidArray[i], XAResource.TMNOFLAGS);
                slaveStmtArray[i]
                        .executeUpdate("delete from dbpriv where user_name='" + roleName.toLowerCase() + "'");
                slaveStmtArray[i]
                        .executeUpdate("delete from tblpriv where user_name='" + roleName.toLowerCase() + "'");
                slaveSaResArray[i].end(slaveXidArray[i], XAResource.TMSUCCESS);
            }

            boolean isAllPred = true;
            int masterRet = masterSaRes.prepare(masterXid);

            if (masterRet == XAResource.XA_OK) {
                int[] slaveRetArray = new int[size];
                for (int i = 0; i < size; i++) {
                    slaveRetArray[i] = slaveSaResArray[i].prepare(slaveXidArray[i]);

                    if (slaveRetArray[i] == XAResource.XA_OK) {
                        continue;
                    } else {
                        isAllPred = false;
                        break;
                    }
                }

                if (isAllPred) {
                    masterSaRes.commit(masterXid, false);
                    for (int i = 0; i < size; i++) {
                        slaveSaResArray[i].commit(slaveXidArray[i], false);
                    }

                    success = true;
                }
            }
        } catch (XAException e) {
            LOG.error("drop role error, role=" + roleName + ", msg=" + e.getMessage());
            throw new MetaException(e.getMessage());
        }
    } catch (SQLException e) {
        LOG.error("drop role error, role=" + roleName + ", msg=" + e.getMessage());
        throw new MetaException(e.getMessage());
    } finally {
        closeConnection(masterConn);
        closeXAConnection(masterDSXaConn);

        for (int i = 0; i < size; i++) {
            closeConnection(slaveConArray[i]);
            closeXAConnection(slaveDSXaConnArray[i]);
        }
    }

    return success;
}

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.  ja va2 s . c om

    /*
     * 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 av  a 2  s  .c  o  m

    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

@Test
public void testRollback() throws Exception {
    if (!DatabaseHelper.DATABASE.supportsXA()) {
        return;//w  ww.j a va 2s  .com
    }

    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;/*w w  w .  j  a va 2  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);
    }
}