private final void rollback0() {
		int curr = currIndex;
		int[] map = dirtyPagesMap;

		if (header.root[1 - curr].index != header.root[curr].shadowIndex) {
			pool.copy(header.root[curr].shadowIndex, header.root[curr].index,
					8L * committedIndexSize);
		}
		else {
			int nPages = (committedIndexSize + dbHandlesPerPage - 1) >>> dbHandlesPerPageBits;

			for (int i = 0; i < nPages; i++) {
				if ((map[i >> 5] & (1 << (i & 31))) != 0) {
					pool.copy(header.root[curr].shadowIndex + (long) i
							* Page.pageSize, header.root[curr].index + (long) i
							* Page.pageSize, Page.pageSize);
				}
			}
		}

		for (int j = (currIndexSize + dbHandlesPerPage * 32 - 1) >>> (dbHandlesPerPageBits + 5); --j >= 0; map[j] = 0);

		header.root[1 - curr].index = header.root[curr].shadowIndex;
		header.root[1 - curr].indexSize = header.root[curr].shadowIndexSize;
		header.root[1 - curr].indexUsed = committedIndexSize;
		header.root[1 - curr].freeList = header.root[curr].freeList;
		header.root[1 - curr].bitmapEnd = header.root[curr].bitmapEnd;
		header.root[1 - curr].size = header.root[curr].size;
		header.root[1 - curr].rootObject = header.root[curr].rootObject;
		header.root[1 - curr].classDescList = header.root[curr].classDescList;
		header.root[1 - curr].bitmapExtent = header.root[curr].bitmapExtent;
		usedSize = header.root[curr].size;
		currIndexSize = committedIndexSize;
		currRBitmapPage = currPBitmapPage = 0;
		currRBitmapOffs = currPBitmapOffs = 0;
		reloadScheme();

		if (listener != null) {
			listener.onTransactionRollback();
		}
	}