diff --git a/Control/StoreGate/src/SGImplSvc.cxx b/Control/StoreGate/src/SGImplSvc.cxx
index 502702c18f911116616eac11a4dabdfb8c3c7d7f..d950f8257e0f4151b0b5add0b603cdf86569ee2b 100644
--- a/Control/StoreGate/src/SGImplSvc.cxx
+++ b/Control/StoreGate/src/SGImplSvc.cxx
@@ -796,12 +796,17 @@ SGImplSvc::proxy(const CLID& id) const
 DataProxy* 
 SGImplSvc::proxy(const CLID& id, bool checkValid) const
 { 
-  lock_t lock (m_mutex);
-  DataProxy* dp = m_pStore->proxy(id);
-  if (0 == dp && 0 != m_pPPS) {
-    dp = m_pPPS->retrieveProxy(id, string("DEFAULT"), *m_pStore);
+  DataProxy* dp = nullptr;
+  {
+    lock_t lock (m_mutex);
+    dp = m_pStore->proxy(id);
+    if (0 == dp && 0 != m_pPPS) {
+      dp = m_pPPS->retrieveProxy(id, string("DEFAULT"), *m_pStore);
+    }
   }
   /// Check if it is valid
+  // Be sure to release the lock before this.
+  // isValid() may call back to the store, so we could otherwise deadlock..
   if (checkValid && 0 != dp) {
     // FIXME: For keyless retrieve, this checks only the first instance
     // of the CLID in store. If that happens to be invalid, but the second
@@ -820,11 +825,16 @@ SGImplSvc::proxy(const CLID& id, const string& key) const
 DataProxy*
 SGImplSvc::proxy(const CLID& id, const string& key, bool checkValid) const
 { 
-  lock_t lock (m_mutex);
-  DataProxy* dp = m_pStore->proxy(id, key);
-  if (0 == dp && 0 != m_pPPS) {
-    dp = m_pPPS->retrieveProxy(id, key, *m_pStore);
+  DataProxy* dp = nullptr;
+  {
+    lock_t lock (m_mutex);
+    dp = m_pStore->proxy(id, key);
+    if (0 == dp && 0 != m_pPPS) {
+      dp = m_pPPS->retrieveProxy(id, key, *m_pStore);
+    }
   }
+  // Be sure to release the lock before this.
+  // isValid() may call back to the store, so we could otherwise deadlock..
   if (checkValid && 0 != dp && !(dp->isValid())) dp = 0;
   return dp;
 }