diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
index a35d259ab34a3bdf6a9d6f99473df1dd2ef5293a..cad507f601b1a3afe350f6beb90e7851b103b600 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
@@ -34,6 +34,7 @@ import javax.validation.Validator;
 import javax.validation.ValidatorFactory;
 
 import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
 import org.hibernate.Query;
 import org.hibernate.SQLQuery;
 import org.hibernate.Session;
@@ -352,6 +353,14 @@ public abstract class AbstractDAO extends HibernateDaoSupport
             });
     }
 
+    protected void lockEntity(Object entityOrNull)
+    {
+        if (entityOrNull != null)
+        {
+            getHibernateTemplate().lock(entityOrNull, LockMode.PESSIMISTIC_WRITE);
+        }
+    }
+
     /**
      * Callback interface for Hibernate code requiring a {@link org.hibernate.StatelessSession}. To
      * be used with {@link HibernateTemplate}'s execution methods, often as anonymous classes within
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
index 0437ed475d314c9237e24c7092eeef2a7af27e9d..97653da7852442e493cfd44c9bc62a41a17d7b2a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
@@ -639,6 +639,7 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         }
 
         final HibernateTemplate template = getHibernateTemplate();
+        lockRelatedEntities(dataset);
         template.save(dataset);
         template.flush();
         scheduleDynamicPropertiesEvaluation(Collections.singletonList(dataset));
@@ -649,6 +650,13 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         }
     }
 
+    private void lockRelatedEntities(DataPE data)
+    {
+        lockEntity(data.getExperiment());
+        lockEntity(data.tryGetSample());
+        lockEntity(data.getContainer());
+    }
+
     @Override
     public void updateDataSet(DataPE data, PersonPE modifier)
     {
@@ -691,6 +699,7 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
             }
             hibernateTemplate.evict(loaded);
         }
+        lockRelatedEntities(data);
         hibernateTemplate.update(data);
         hibernateTemplate.flush();
         scheduleDynamicPropertiesEvaluation(Collections.singletonList(data));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
index 16626f5983c5540d6ff96ba92b3ad7b5799d6711..bfc561e74991e5fd0d4e6f0773ceaf7b52630827 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
@@ -387,6 +387,8 @@ public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<Experi
     public void createOrUpdateExperiment(ExperimentPE experiment, PersonPE modifier)
     {
         HibernateTemplate template = getHibernateTemplate();
+        lockEntity(experiment.getProject());
+
         internalCreateOrUpdateExperiment(experiment, modifier, template);
         template.flush();
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 01c9cfcaca94532c84ce604fe85425ec984d67d0..dc5b51fe2ec821ac6cf2455277fb699120038d09 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -86,8 +86,10 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         {
             sample.setModificationDate(new Date());
         }
-        // sample.setModifier(modifier);
-        // sample.setModificationDate(new Date());
+        lockEntity(sample.getDatabaseInstance());
+        lockEntity(sample.getSpace());
+        lockEntity(sample.getExperiment());
+        lockEntity(sample.getContainer());
         hibernateTemplate.saveOrUpdate(sample);
         if (doLog && operationLog.isInfoEnabled())
         {