public boolean commitTransaction(Session session) {

    if (session.abortTransaction) {
      return false;
    }

    int limit = session.rowActionList.size();
    Object[] list = limit == 0 ? ValuePool.emptyObjectArray : session.rowActionList.getArray();

    try {
      writeLock.lock();
      endTransaction(session);

      if (limit == 0) {
        endTransactionTPL(session);

        try {
          session.logSequences();
        } catch (HsqlException e) {
        }

        return true;
      }

      // new actionTimestamp used for commitTimestamp
      // already set in prepareCommitActions();
      session.actionTimestamp = nextChangeTimestamp();

      for (int i = 0; i < limit; i++) {
        RowAction action = (RowAction) list[i];

        action.commit(session);
      }

      for (int i = 0; i < limit; i++) {
        RowAction action = (RowAction) list[i];

        if (action.type == RowActionBase.ACTION_NONE) {
          continue;
        }

        int type = action.getCommitType(session.actionTimestamp);
        PersistentStore store = session.sessionData.getRowStore(action.table);
        Row row = action.memoryRow;

        if (row == null) {
          row = (Row) store.get(action.getPos(), false);
        }

        if (action.table.hasLobColumn) {
          switch (type) {
            case RowActionBase.ACTION_INSERT:
              session.sessionData.addLobUsageCount(action.table, row.getData());
              break;

            default:
          }
        }

        if (action.table.tableType == TableBase.TEXT_TABLE) {
          switch (type) {
            case RowActionBase.ACTION_DELETE:
              store.removePersistence(action.getPos());
              break;

            case RowActionBase.ACTION_INSERT:
              store.commitPersistence(row);
              break;

            default:
          }
        }
      }

      // session.actionTimestamp is the committed tx timestamp
      if (getFirstLiveTransactionTimestamp() > session.actionTimestamp) {
        mergeTransaction(session, list, 0, limit, session.actionTimestamp);
        rowActionMapRemoveTransaction(list, 0, limit, true);
      } else {
        list = session.rowActionList.toArray();

        addToCommittedQueue(session, list);
      }

      try {
        session.logSequences();
        database.logger.writeCommitStatement(session);
      } catch (HsqlException e) {
      }

      endTransactionTPL(session);

      return true;
    } finally {
      writeLock.unlock();
      session.tempSet.clear();
    }
  }