diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
index 1a0df5cfaf8bbe6342a4a64c1b2266cd7399fc58..3f1c33ce297f02a604961d0f952fbe8fe34304a6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
@@ -20,13 +20,12 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
 
-import net.lemnik.eodsql.DynamicTransactionQuery;
-
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
 import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked;
@@ -96,6 +95,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifierFactory;
 
+import net.lemnik.eodsql.DynamicTransactionQuery;
+
 /**
  * Abstract superclass for the states a DataSetRegistrationTransaction can be in.
  * 
@@ -183,6 +184,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
         private final List<ExperimentUpdatable> experimentsToBeUpdated =
                 new ArrayList<ExperimentUpdatable>();
 
+        private HashSet<String> registeredIdentifiers = new HashSet<>();
+
         private final List<Space> spacesToBeRegistered = new ArrayList<Space>();
 
         private final List<Project> projectsToBeRegistered = new ArrayList<Project>();
@@ -571,6 +574,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             Sample sample = new Sample(sampleIdentifierString, permId);
             sample.setSampleType(sampleTypeCode);
             samplesToBeRegistered.add(sample);
+            addIdentifier(sampleIdentifierString, "Sample");
             return sample;
         }
 
@@ -612,9 +616,19 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             Sample sample = new Sample(sampleIdentifierString, permId);
             sample.setSampleType(sampleTypeCode);
             samplesToBeRegistered.add(sample);
+            addIdentifier(sampleIdentifierString, "Sample");
             return sample;
         }
 
+        /// Asserts that given entity hasn't been yet created within this transaction
+        private void addIdentifier(String identifier, String entityKind)
+        {
+            String updatedId = entityKind + identifier.trim().toUpperCase();
+            if (registeredIdentifiers.contains(updatedId))
+                throw new IllegalArgumentException(entityKind + " with identifier " + identifier + " has already been created in this transaction");
+            registeredIdentifiers.add(updatedId);
+        }
+
         public IExperimentUpdatable getExperimentForUpdate(String experimentIdentifierString)
         {
             ExperimentIdentifier identifier =
@@ -696,6 +710,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             Experiment experiment = new Experiment(experimentIdentifierString, permId);
             experiment.setExperimentType(experimentTypeCode);
             experimentsToBeRegistered.add(experiment);
+            addIdentifier(experimentIdentifierString, "Experiment");
             return experiment;
         }
 
@@ -703,6 +718,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
         {
             Space space = new Space(spaceCode, spaceAdminUserIdOrNull);
             spacesToBeRegistered.add(space);
+            addIdentifier(spaceCode, "Space");
             return space;
         }
 
@@ -710,6 +726,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
         {
             Project project = new Project(projectIdentifier);
             projectsToBeRegistered.add(project);
+            addIdentifier(projectIdentifier, "Project");
             return project;
         }