opt2
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
index 61414ea..8a9cd5c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
@@ -39,6 +39,10 @@
 
     public Page readPage(int cacheId, long pageId) throws IgniteCheckedException;
 
+    public long readLockPageAddr(int cacheId, long pageId) throws IgniteCheckedException;
+
+    public void releaseReadLock(long absPtr) throws IgniteCheckedException;
+
     public long pageAddr(int cacheId, long pageId) throws IgniteCheckedException;
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index d5777de..ba906dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -281,6 +281,23 @@
     }
 
     @Override
+    public long readLockPageAddr(int cacheId, long pageId) throws IgniteCheckedException {
+        Segment seg = segment(pageId);
+
+        long absPtr = seg.absolute(pageId);
+
+        if (readLockPage(absPtr, PageIdUtils.tag(pageId)))
+            return absPtr + PageMemoryNoStoreImpl.PAGE_OVERHEAD;
+
+        return -1L;
+    }
+
+    @Override
+    public void releaseReadLock(long absPtr) throws IgniteCheckedException {
+        readUnlockPage(absPtr - PageMemoryNoStoreImpl.PAGE_OVERHEAD);
+    }
+
+    @Override
     public long pageAddr(int cacheId, long pageId) throws IgniteCheckedException {
         Segment seg = segment(pageId);
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
index 5fe15a0..552b28b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
@@ -154,7 +154,7 @@
 
     /** {@inheritDoc} */
     @Override public void close() {
-        pageMem.releasePage(this);
+        //pageMem.releasePage(this);
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
index 89636cb..5e4c8ec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
@@ -76,31 +76,36 @@
         boolean first = true;
 
         do {
-            long buf = cctx.shared().database().pageMemory().pageAddr(cctx.cacheId(), pageId(nextLink));
+            long buf = cctx.shared().database().pageMemory().readLockPageAddr(cctx.cacheId(), pageId(nextLink));
 
-            DataPageIO io = DataPageIO.VERSION1;
+            try {
+                DataPageIO io = DataPageIO.VERSION1;
 
-            long addr = io.getPositionOnPayload(buf, itemId(nextLink));
+                long addr = io.getPositionOnPayload(buf, itemId(nextLink));
 
-            addr = addr + buf;
+                addr = addr + buf;
 
-            int len = GridUnsafe.UNSAFE.getInt(addr);
+                int len = GridUnsafe.UNSAFE.getInt(addr);
 
-            //byte type = buf.get();
+                //byte type = buf.get();
 
-            int size = Math.min(bytes.length, len);
+                int size = Math.min(bytes.length, len);
 
-            addr += 5;
+                addr += 5;
 
-            for (int i = 0; i < size; i++) {
-                byte b1 = GridUnsafe.UNSAFE.getByte(addr++);
-                byte b2 = bytes[i];
+                for (int i = 0; i < size; i++) {
+                    byte b1 = GridUnsafe.UNSAFE.getByte(addr++);
+                    byte b2 = bytes[i];
 
-                if (b1 != b2)
-                    return b1 > b2 ? 1 : -1;
+                    if (b1 != b2)
+                        return b1 > b2 ? 1 : -1;
+                }
+
+                return Integer.compare(len, bytes.length);
             }
-
-            return Integer.compare(len, bytes.length);
+            finally {
+                cctx.shared().database().pageMemory().releaseReadLock(buf);
+            }
         }
         while(nextLink != 0);
     }
@@ -170,15 +175,20 @@
         IncompleteObject<?> incomplete = null;
         boolean first = true;
 
-        long buf = cctx.shared().database().pageMemory().pageAddr(cctx.cacheId(), pageId(nextLink));
+        long buf = cctx.shared().database().pageMemory().readLockPageAddr(cctx.cacheId(), pageId(nextLink));
 
-        DataPageIO io = DataPageIO.VERSION1;
+        try {
+            DataPageIO io = DataPageIO.VERSION1;
 
-        long addr = io.getPositionOnPayload(buf, itemId(nextLink));
+            long addr = io.getPositionOnPayload(buf, itemId(nextLink));
 
-        addr = addr + buf;
+            addr = addr + buf;
 
-        readFullRow(coctx, addr, keyOnly);
+            readFullRow(coctx, addr, keyOnly);
+        }
+        finally {
+            cctx.shared().database().pageMemory().releaseReadLock(buf);
+        }
     }
 
     /**