You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-user@db.apache.org by Peter Ondruška <pe...@kaibo.eu> on 2014/11/25 11:59:50 UTC

Locks on crashed database

Dear all,

I have a database that has locks in SYSCS_DIAG.LOCK_TABLE. How do I remove
those locks? I restarted the database but the locks are still there.
SYSCS_DIAG.TRANSACTION_TABLE also has related record with status PREPARED.
This database was used with XA on application server but it was removed for
troubleshooting.

Thanks

-- 
Peter Ondruška

Re: Locks on crashed database

Posted by Peter Ondruška <pe...@kaibo.eu>.
Dear Knut,

many thanks for the tip. For others who need something similar here is the
complete code:

package xarecovery;

import java.sql.SQLException;
import java.util.logging.Level;

import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;

import org.apache.derby.jdbc.EmbeddedDataSource;
import org.apache.derby.jdbc.EmbeddedXADataSource;

/**
 * Remove obsolete lock records caused by not gracefully removing database
that was under transaction manager control.<br />
 * This can be observed by having records in TRANSACTION_TABLE (and related
in LOCK_TABLE) with state PREPARED:<br />
 * SELECT * FROM SYSCS_DIAG.LOCK_TABLE;<br />
 * SELECT * FROM SYSCS_DIAG.TRANSACTION_TABLE;
 *
 * @author Knut Anders Hatlen, Peter Ondruška (just slightly modified)
 *
 */
public class Recover {

  private static final java.util.logging.Logger LOGGER =
java.util.logging.Logger.getLogger(Recover.class.getName());

  public static void main(final String[] args) {

    final EmbeddedDataSource eds = new EmbeddedXADataSource();
    eds.setDatabaseName("pathtodatabase");

    final XADataSource ds = (EmbeddedXADataSource) eds;

    try {
      final XAConnection xac = ds.getXAConnection();
      final XAResource xar = xac.getXAResource();
      for (final Xid xid : xar.recover(XAResource.TMSTARTRSCAN)) {
        LOGGER.log(Level.INFO, "Recover using rollback Xid {0}",
xid.toString());
        xar.rollback(xid);
      }
      xac.close();
    } catch (final SQLException | XAException e) {
      LOGGER.log(Level.WARNING, null, e);
    }

    try {
      eds.setShutdownDatabase("shutdown");
      eds.getConnection();
    } catch (final SQLException e) {
      LOGGER.log(Level.INFO, "This exception is OK", e);
    }

  }

}


On 25 November 2014 at 12:49, Knut Anders Hatlen <kn...@oracle.com>
wrote:

> Peter Ondruška <pe...@kaibo.eu> writes:
>
> > Dear all,
> >
> > I have a database that has locks in SYSCS_DIAG.LOCK_TABLE. How do I
> > remove those locks? I restarted the database but the locks are still
> > there. SYSCS_DIAG.TRANSACTION_TABLE also has related record with
> > status PREPARED. This database was used with XA on application server
> > but it was removed for troubleshooting.
>
> Hi Peter,
>
> You probably need to run XA recovery and commit or roll back the
> prepared transactions. Something like this:
>
>         XADataSource ds = ....;
>         XAConnection xac = ds.getXAConnection();
>         XAResource xar = xac.getXAResource();
>         for (Xid xid : xar.recover(XAResource.TMSTARTRSCAN)) {
>             xar.rollback(xid);
>             // or, if you prefer, xar.commit(xid, false);
>         }
>
> Hope this helps,
>
> --
> Knut Anders
>



-- 
Peter Ondruška

Re: Locks on crashed database

Posted by Knut Anders Hatlen <kn...@oracle.com>.
Peter Ondruška <pe...@kaibo.eu> writes:

> Dear all,
>
> I have a database that has locks in SYSCS_DIAG.LOCK_TABLE. How do I
> remove those locks? I restarted the database but the locks are still
> there. SYSCS_DIAG.TRANSACTION_TABLE also has related record with
> status PREPARED. This database was used with XA on application server
> but it was removed for troubleshooting.

Hi Peter,

You probably need to run XA recovery and commit or roll back the
prepared transactions. Something like this:

        XADataSource ds = ....;
        XAConnection xac = ds.getXAConnection();
        XAResource xar = xac.getXAResource();
        for (Xid xid : xar.recover(XAResource.TMSTARTRSCAN)) {
            xar.rollback(xid);
            // or, if you prefer, xar.commit(xid, false);
        }

Hope this helps,

-- 
Knut Anders