diff --git a/product/ERP5Type/Cache.py b/product/ERP5Type/Cache.py
index 6ba712647dd9fbafe2b1484941eda8de75b7515b..61441558f3ef430d2cef11ac7729f87598f98d62 100644
--- a/product/ERP5Type/Cache.py
+++ b/product/ERP5Type/Cache.py
@@ -207,6 +207,27 @@ class CachingMethod:
                 
 allow_class(CachingMethod)
 
+# TransactionCache is a cache per transaction. The purpose of this cache is
+# to accelerate some heavy read-only operations. Note that this must not be
+# enabled when a trasaction may modify ZODB objects.
+def getReadOnlyTransactionCache(context):
+  """Get the transaction cache.
+  """
+  try:
+    return context.REQUEST['_erp5_read_only_transaction_cache']
+  except KeyError:
+    return None
+
+def enableReadOnlyTransactionCache(context):
+  """Enable the transaction cache.
+  """
+  context.REQUEST.set('_erp5_read_only_transaction_cache', {})
+
+def disableReadOnlyTransactionCache(context):
+  """Disable the transaction cache.
+  """
+  context.REQUEST.set('_erp5_read_only_transaction_cache', None)
+
 ########################################################
 ## Old global cache functions                         ##
 ## TODO: Check if it make sense to keep them any more ##
@@ -219,15 +240,3 @@ def clearCache(method_id=None):
   otherwise, it clears the whole cache.
   """
   pass 
-
-def getReadOnlyTransactionCache(context):
-  """ Get the transaction cache.  """
-  pass
-
-def enableReadOnlyTransactionCache(context):
-  """ Enable the transaction cache. """
-  pass
-
-def disableReadOnlyTransactionCache(context):
-  """ Disable the transaction cache. """
-  pass