diff --git a/src/mongo/db/pipeline/document_source_graph_lookup.cpp b/src/mongo/db/pipeline/document_source_graph_lookup.cpp
index cf04ba70a9f..f320bf48b2e 100644
--- a/src/mongo/db/pipeline/document_source_graph_lookup.cpp
+++ b/src/mongo/db/pipeline/document_source_graph_lookup.cpp
@@ -248,7 +248,9 @@ void DocumentSourceGraphLookUp::doDispose() {
 }
 
 bool DocumentSourceGraphLookUp::foreignShardedGraphLookupAllowed() const {
-    return !pExpCtx->opCtx->inMultiDocumentTransaction();
+    const auto fcvSnapshot = serverGlobalParams.mutableFCV.acquireFCVSnapshot();
+    return !pExpCtx->opCtx->inMultiDocumentTransaction() ||
+        gFeatureFlagAllowAdditionalParticipants.isEnabled(fcvSnapshot);
 }
 
 boost::optional<DocumentSource::DistributedPlanLogic>
diff --git a/src/mongo/db/pipeline/document_source_graph_lookup.h b/src/mongo/db/pipeline/document_source_graph_lookup.h
index 999afd49b9e..a80b35991f1 100644
--- a/src/mongo/db/pipeline/document_source_graph_lookup.h
+++ b/src/mongo/db/pipeline/document_source_graph_lookup.h
@@ -69,6 +69,7 @@
 #include "mongo/db/pipeline/stage_constraints.h"
 #include "mongo/db/pipeline/variables.h"
 #include "mongo/db/query/query_shape/serialization_options.h"
+#include "mongo/db/server_feature_flags_gen.h"
 #include "mongo/stdx/unordered_set.h"
 #include "mongo/util/assert_util.h"
 #include "mongo/util/intrusive_counter.h"
@@ -91,7 +92,9 @@ public:
 
         Status checkShardedForeignCollAllowed(const NamespaceString& nss,
                                               bool inMultiDocumentTransaction) const override {
-            if (!inMultiDocumentTransaction || _foreignNss != nss) {
+            const auto fcvSnapshot = serverGlobalParams.mutableFCV.acquireFCVSnapshot();
+            if (!inMultiDocumentTransaction || _foreignNss != nss ||
+                gFeatureFlagAllowAdditionalParticipants.isEnabled(fcvSnapshot)) {
                 return Status::OK();
             }
 
diff --git a/src/mongo/db/pipeline/document_source_lookup.cpp b/src/mongo/db/pipeline/document_source_lookup.cpp
index 432f0643eaf..cbb3bb549c1 100644
--- a/src/mongo/db/pipeline/document_source_lookup.cpp
+++ b/src/mongo/db/pipeline/document_source_lookup.cpp
@@ -455,7 +455,9 @@ const char* DocumentSourceLookUp::getSourceName() const {
 }
 
 bool DocumentSourceLookUp::foreignShardedLookupAllowed() const {
-    return !pExpCtx->opCtx->inMultiDocumentTransaction();
+    const auto fcvSnapshot = serverGlobalParams.mutableFCV.acquireFCVSnapshot();
+    return !pExpCtx->opCtx->inMultiDocumentTransaction() ||
+        gFeatureFlagAllowAdditionalParticipants.isEnabled(fcvSnapshot);
 }
 
 void DocumentSourceLookUp::determineSbeCompatibility() {
diff --git a/src/mongo/db/pipeline/document_source_lookup.h b/src/mongo/db/pipeline/document_source_lookup.h
index b3998efa873..82d7d272e9a 100644
--- a/src/mongo/db/pipeline/document_source_lookup.h
+++ b/src/mongo/db/pipeline/document_source_lookup.h
@@ -73,6 +73,7 @@
 #include "mongo/db/pipeline/variables.h"
 #include "mongo/db/query/collation/collator_interface.h"
 #include "mongo/db/query/query_shape/serialization_options.h"
+#include "mongo/db/server_feature_flags_gen.h"
 #include "mongo/stdx/unordered_set.h"
 #include "mongo/util/assert_util.h"
 #include "mongo/util/intrusive_counter.h"
@@ -119,7 +120,9 @@ public:
          */
         Status checkShardedForeignCollAllowed(
             const NamespaceString& nss, bool inMultiDocumentTransaction) const override final {
-            if (!inMultiDocumentTransaction) {
+            const auto fcvSnapshot = serverGlobalParams.mutableFCV.acquireFCVSnapshot();
+            if (!inMultiDocumentTransaction ||
+                gFeatureFlagAllowAdditionalParticipants.isEnabled(fcvSnapshot)) {
                 return Status::OK();
             }
             auto involvedNss = getInvolvedNamespaces();
diff --git a/src/mongo/db/pipeline/sharded_agg_helpers.cpp b/src/mongo/db/pipeline/sharded_agg_helpers.cpp
index 0ef18c5de5e..d534d59594c 100644
--- a/src/mongo/db/pipeline/sharded_agg_helpers.cpp
+++ b/src/mongo/db/pipeline/sharded_agg_helpers.cpp
@@ -1992,8 +1992,8 @@ std::unique_ptr<Pipeline, PipelineDeleter> preparePipelineForExecution(
             // getCollectionRoutingInfoForTxnCmd to get CRI with historical data for transactions
             // with snapshot isolations. We wrap the result into boost::optional, as the next
             // function accept only boost::optional.
-            boost::optional<CollectionRoutingInfo> targetingCri =
-                uassertStatusOK(getCollectionRoutingInfoForTxnCmd(opCtx, expCtx->ns));
+            boost::optional<CollectionRoutingInfo> targetingCri = uassertStatusOK(
+                getCollectionRoutingInfoForTxnCmd(opCtx, expCtx->ns, /*allowLocks*/ true));
             TargetingResults targeting = targetPipeline(
                 expCtx, pipeline.get(), pipelineDataSource, shardTargetingPolicy, targetingCri);
 
diff --git a/src/mongo/s/cluster_commands_helpers.cpp b/src/mongo/s/cluster_commands_helpers.cpp
index db0d9e8a95b..ed8f0a5852a 100644
--- a/src/mongo/s/cluster_commands_helpers.cpp
+++ b/src/mongo/s/cluster_commands_helpers.cpp
@@ -821,7 +821,8 @@ std::vector<AsyncRequestsSender::Request> getVersionedRequestsForTargetedShards(
 }
 
 StatusWith<CollectionRoutingInfo> getCollectionRoutingInfoForTxnCmd(OperationContext* opCtx,
-                                                                    const NamespaceString& nss) {
+                                                                    const NamespaceString& nss,
+                                                                    bool allowLocks) {
     auto catalogCache = Grid::get(opCtx)->catalogCache();
     invariant(catalogCache);
 
@@ -840,7 +841,7 @@ StatusWith<CollectionRoutingInfo> getCollectionRoutingInfoForTxnCmd(OperationCon
         }
     }
 
-    return catalogCache->getCollectionRoutingInfo(opCtx, nss);
+    return catalogCache->getCollectionRoutingInfo(opCtx, nss, allowLocks);
 }
 
 StatusWith<Shard::QueryResponse> loadIndexesFromAuthoritativeShard(
diff --git a/src/mongo/s/cluster_commands_helpers.h b/src/mongo/s/cluster_commands_helpers.h
index 90f46386402..07f2be85c51 100644
--- a/src/mongo/s/cluster_commands_helpers.h
+++ b/src/mongo/s/cluster_commands_helpers.h
@@ -391,7 +391,8 @@ std::vector<AsyncRequestsSender::Request> getVersionedRequestsForTargetedShards(
  * Should be used by all router commands that can be run in a transaction when targeting shards.
  */
 StatusWith<CollectionRoutingInfo> getCollectionRoutingInfoForTxnCmd(OperationContext* opCtx,
-                                                                    const NamespaceString& nss);
+                                                                    const NamespaceString& nss,
+                                                                    bool allowLocks = false);
 
 /**
  * Loads all of the indexes for the given namespace from the appropriate shard. For unsharded
