diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
index 9845c86781cf99cc360aaf6a08028ed6cf659648..775f7f376a6687b715159548876341c7d6667539 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBUtils.java
@@ -92,35 +92,62 @@ public class DBUtils
      */
     public static void createDataSet(IGenericDAO dao, DMDataSetDTO dataSet)
     {
-        DMExperimentDTO experiment = dao.getExperimentByPermId(dataSet.getExperiment().getPermId());
-        if (experiment == null)
-        {
-            experiment = dataSet.getExperiment();
-            final long experimentId = dao.addExperiment(experiment);
-            experiment.setId(experimentId);
-            dataSet.setExperimentId(experimentId); // make sure all the ids are set correctly.
-        } else
-        {
-            dataSet.setExperimentId(experiment.getId()); // make sure all the ids are set correctly.
-        }
+        DMExperimentDTO experiment = getOrCreateExperiment(dao, dataSet);
+        dataSet.setExperimentId(experiment.getId()); // make sure all the ids are set correctly.
 
         if (dataSet.getSample() != null)
         {
-            DMSampleDTO sample = dao.getSampleByPermId(dataSet.getSample().getPermId());
-            if (sample == null)
+            String permId = dataSet.getSample().getPermId();
+            DMSampleDTO sample;
+            // it may have happened that the sample has been created by another thread after
+            // we checked that it does not exist
+            synchronized (IGenericDAO.class)
             {
-                sample = dataSet.getSample();
-                sample.setExperiment(experiment);
-                final long sampleId = dao.addSample(sample);
-                sample.setId(sampleId);
-                dataSet.setSample(sample); // make sure all the ids are set correctly.
-            } else
-            {
-                dataSet.setSample(sample);
-                sample.setExperiment(experiment);
+                sample = dao.getSampleByPermId(permId);
+                if (sample == null)
+                {
+                    sample = dataSet.getSample();
+                    sample.setExperiment(experiment);
+                    sample = createSample(dao, sample, permId);
+                }
             }
+            sample.setExperiment(experiment);
+            dataSet.setSample(sample); // make sure all the ids are set correctly.
         }
         long dataSetId = dao.addDataSet(dataSet);
         dataSet.setId(dataSetId);
     }
+
+    private static DMSampleDTO createSample(IGenericDAO dao, DMSampleDTO sample, String samplePermId)
+    {
+        final long sampleId = dao.addSample(sample);
+        sample.setId(sampleId);
+        return sample;
+    }
+
+    private static DMExperimentDTO getOrCreateExperiment(IGenericDAO dao, DMDataSetDTO dataSet)
+    {
+        String permId = dataSet.getExperiment().getPermId();
+        // it may have happened that the experiment has been created by another thread after
+        // we checked that it does not exist
+        synchronized (IGenericDAO.class)
+        {
+            DMExperimentDTO experiment = dao.getExperimentByPermId(permId);
+            if (experiment == null)
+            {
+                experiment = createExperiment(dao, dataSet, permId);
+            }
+            return experiment;
+        }
+    }
+
+    private static DMExperimentDTO createExperiment(IGenericDAO dao, DMDataSetDTO dataSet,
+            String permId)
+    {
+        DMExperimentDTO experiment;
+        experiment = dataSet.getExperiment();
+        long experimentId = dao.addExperiment(experiment);
+        experiment.setId(experimentId);
+        return experiment;
+    }
 }