@Override
    public void execute(TrnAction trnAction) {
        if ( LOGGER.isLoggable(Level.FINE) ) {
            LOGGER.fine("start transaction...: trn id=" + trnAction);
        }

        TrnResource resource = resourceFactory.createResource();
        TrnResourceRegistry.pushTrnResource(resource);
        try {
            trnAction.run();
            resource.commit();

            if ( LOGGER.isLoggable(Level.FINE) ) {
                LOGGER.fine("transaction succeeded: trn id=" + trnAction);
            }
        } catch (Exception ex) {
            exceptionHandler.handleException(ex);
            resource.rollback();
            if ( LOGGER.isLoggable(Level.FINE) ) {
                LOGGER.fine("transaction failed: trn id=" + trnAction);
            }
        } finally {
            TrnResourceRegistry.popCurrentTrnResource();
            resource.close();
        }
    }