diff --git a/app/services/ml/create_experiment_service.rb b/app/services/ml/create_experiment_service.rb
index 8c49856fe150ca2ed456f9cdd2d7acb57e650fb0..bd623270df0d628658b59ad6edb9559c207b3bcb 100644
--- a/app/services/ml/create_experiment_service.rb
+++ b/app/services/ml/create_experiment_service.rb
@@ -15,6 +15,9 @@ def execute
       return error(experiment.errors.full_messages) unless experiment.persisted?
 
       success(experiment)
+
+    rescue ActiveRecord::RecordNotUnique => e
+      error([e.message])
     end
 
     private
diff --git a/spec/services/ml/create_experiment_service_spec.rb b/spec/services/ml/create_experiment_service_spec.rb
index 2f3a15746f1d018be13d7d0d229fbbd97843511d..be11365ab711b2ecb98e78e8baba516b1b6a2414 100644
--- a/spec/services/ml/create_experiment_service_spec.rb
+++ b/spec/services/ml/create_experiment_service_spec.rb
@@ -41,5 +41,28 @@
         expect(response.message).to include("Name can't be blank")
       end
     end
+
+    context 'when a RecordNotUnique error occurs' do
+      let_it_be(:pg_error) { 'PG::UniqueViolation: ERROR: duplicate key value violates unique constraint' }
+
+      before do
+        allow_next_instance_of(::Ml::Experiment) do |experiment|
+          allow(experiment).to receive(:save).and_raise(
+            ActiveRecord::RecordNotUnique.new(pg_error)
+          )
+        end
+      end
+
+      it 'returns an error response with the exception message' do
+        response = create_experiment
+
+        expect(response).to be_error
+        expect(response.message).to include(pg_error)
+      end
+
+      it 'does not persist the experiment' do
+        expect { create_experiment }.not_to change { Ml::Experiment.count }
+      end
+    end
   end
 end