This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new c38ed6a8e3a Support opengauss route strategy on read write split 
(#17747)
c38ed6a8e3a is described below

commit c38ed6a8e3aa35761f31930960ee60ad19ade711
Author: JingShang Lu <[email protected]>
AuthorDate: Wed May 25 20:03:43 2022 +0800

    Support opengauss route strategy on read write split (#17747)
    
    * read write for opengauss
    
    * support opengauss route strategy on read write split
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * add UT
    
    * fix
---
 .../ReplicaLoadBalanceAlgorithmFactory.java        | 14 +++---
 ...thm.java => ReadQueryLoadBalanceAlgorithm.java} |  2 +-
 ...rovidedReadwriteSplittingRuleConfiguration.java |  4 +-
 ....java => FixedPrimaryLoadBalanceAlgorithm.java} | 15 +++---
 ...=> FixedReplicaRandomLoadBalanceAlgorithm.java} | 14 ++++--
 ...ixedReplicaRoundRobinLoadBalanceAlgorithm.java} | 19 ++++----
 ...=> FixedReplicaWeightLoadBalanceAlgorithm.java} | 14 ++++--
 .../RandomReplicaLoadBalanceAlgorithm.java         |  8 +++-
 .../RoundRobinReplicaLoadBalanceAlgorithm.java     |  8 +++-
 ...nsactionRandomReplicaLoadBalanceAlgorithm.java} |  8 ++--
 ...tionRoundRobinReplicaLoadBalanceAlgorithm.java} | 13 ++---
 ...nsactionWeightReplicaLoadBalanceAlgorithm.java} |  8 ++--
 .../WeightReplicaLoadBalanceAlgorithm.java         |  8 +++-
 .../impl/ReadwriteSplittingDataSourceRouter.java   |  8 +---
 .../rule/ReadwriteSplittingDataSourceRule.java     |  6 +--
 .../rule/ReadwriteSplittingRule.java               |  8 ++--
 ...itesplitting.spi.ReadQueryLoadBalanceAlgorithm} |  7 +++
 ...a => FixedPrimaryLoadBalanceAlgorithmTest.java} | 11 ++---
 ...ixedReplicaRandomLoadBalanceAlgorithmTest.java} | 16 +++++--
 ...ReplicaRoundRobinLoadBalanceAlgorithmTest.java} | 17 +++++--
 ...ixedReplicaWeightLoadBalanceAlgorithmTest.java} | 33 ++++++++-----
 .../RandomReplicaLoadBalanceAlgorithmTest.java     | 14 +++++-
 .../RoundRobinReplicaLoadBalanceAlgorithmTest.java | 13 +++++
 ...tionRandomReplicaLoadBalanceAlgorithmTest.java} | 15 +++---
 ...nRoundRobinReplicaLoadBalanceAlgorithmTest.java | 56 ++++++++++++++++++++++
 ...tionWeightReplicaLoadBalanceAlgorithmTest.java} | 29 ++++++-----
 .../WeightReplicaLoadBalanceAlgorithmTest.java     | 13 +++++
 ...dwriteSplittingRuleSpringbootConfiguration.java |  6 +--
 ...riteSplittingAlgorithmProvidedBeanRegistry.java |  6 +--
 .../ReplicaLoadBalanceAlgorithmFactoryBean.java    |  8 ++--
 .../ReadwriteSplittingSpringNamespaceTest.java     |  6 +--
 .../transaction/TransactionHolder.java             | 21 ++++++++
 .../resources/conf/config-readwrite-splitting.yaml |  8 ++++
 33 files changed, 302 insertions(+), 134 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
index 188d6c0c7e0..ffc61df1bed 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
 import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
@@ -33,7 +33,7 @@ import 
org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
 public final class ReplicaLoadBalanceAlgorithmFactory {
     
     static {
-        
ShardingSphereServiceLoader.register(ReplicaLoadBalanceAlgorithm.class);
+        
ShardingSphereServiceLoader.register(ReadQueryLoadBalanceAlgorithm.class);
     }
     
     /**
@@ -41,8 +41,8 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
      *
      * @return created instance
      */
-    public static ReplicaLoadBalanceAlgorithm newInstance() {
-        return 
RequiredSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class);
+    public static ReadQueryLoadBalanceAlgorithm newInstance() {
+        return 
RequiredSPIRegistry.getRegisteredService(ReadQueryLoadBalanceAlgorithm.class);
     }
     
     /**
@@ -51,8 +51,8 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
      * @param replicaLoadBalanceAlgorithmConfig replica load-balance algorithm 
configuration
      * @return created instance
      */
-    public static ReplicaLoadBalanceAlgorithm newInstance(final 
ShardingSphereAlgorithmConfiguration replicaLoadBalanceAlgorithmConfig) {
-        return 
ShardingSphereAlgorithmFactory.createAlgorithm(replicaLoadBalanceAlgorithmConfig,
 ReplicaLoadBalanceAlgorithm.class);
+    public static ReadQueryLoadBalanceAlgorithm newInstance(final 
ShardingSphereAlgorithmConfiguration replicaLoadBalanceAlgorithmConfig) {
+        return 
ShardingSphereAlgorithmFactory.createAlgorithm(replicaLoadBalanceAlgorithmConfig,
 ReadQueryLoadBalanceAlgorithm.class);
     }
     
     /**
@@ -62,6 +62,6 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
      * @return contains replica load-balance algorithm or not
      */
     public static boolean contains(final String 
replicaLoadBalanceAlgorithmType) {
-        return 
TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, 
replicaLoadBalanceAlgorithmType).isPresent();
+        return 
TypedSPIRegistry.findRegisteredService(ReadQueryLoadBalanceAlgorithm.class, 
replicaLoadBalanceAlgorithmType).isPresent();
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
similarity index 93%
rename from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
rename to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
index caaaef346fe..8c3d5d1d7e9 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
@@ -25,7 +25,7 @@ import java.util.List;
 /**
  * Replica load-balance algorithm.
  */
-public interface ReplicaLoadBalanceAlgorithm extends ShardingSphereAlgorithm, 
RequiredSPI {
+public interface ReadQueryLoadBalanceAlgorithm extends 
ShardingSphereAlgorithm, RequiredSPI {
     
     /**
      * Get data source.
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
index fe03ce5794d..a842797f7f4 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
@@ -24,7 +24,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.infra.config.function.DistributedRuleConfiguration;
 import org.apache.shardingsphere.infra.config.scope.SchemaRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
@@ -42,5 +42,5 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfiguration implemen
     
     private Collection<ReadwriteSplittingDataSourceRuleConfiguration> 
dataSources = new LinkedList<>();
     
-    private Map<String, ReplicaLoadBalanceAlgorithm> loadBalanceAlgorithms = 
new LinkedHashMap<>();
+    private Map<String, ReadQueryLoadBalanceAlgorithm> loadBalanceAlgorithms = 
new LinkedHashMap<>();
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
similarity index 73%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
index 14c53b1a190..d8460d87e14 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
@@ -18,19 +18,18 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.List;
 import java.util.Properties;
-import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Random replica load-balance algorithm.
+ * Fixed primary load-balance algorithm.
  */
-@Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class FixedPrimaryLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
-    private Properties props = new Properties();
+    @Getter
+    private Properties props;
     
     @Override
     public void init(final Properties props) {
@@ -39,11 +38,11 @@ public final class RandomReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
-        return 
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
+        return writeDataSourceName;
     }
     
     @Override
     public String getType() {
-        return "RANDOM";
+        return "FIXED_PRIMARY";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
similarity index 68%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
index 14c53b1a190..d3c2e856f9b 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
@@ -18,17 +18,18 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Random replica load-balance algorithm.
+ * Fixed replica random load-balance algorithm.
  */
 @Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaRandomLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private Properties props = new Properties();
     
@@ -39,11 +40,14 @@ public final class RandomReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
-        return 
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
+        if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+            
TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size())));
+        }
+        return TransactionHolder.getReadWriteSplitRoutedReplica();
     }
     
     @Override
     public String getType() {
-        return "RANDOM";
+        return "FIXED_REPLICA_RANDOM";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
similarity index 68%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
index 69a40a18c99..b2ca75b5a57 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
@@ -18,16 +18,17 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * Round-robin replica load-balance algorithm.
+ * Fixed replica round-robin load-balance algorithm.
  */
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaRoundRobinLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private final AtomicInteger count = new AtomicInteger(0);
     
@@ -41,16 +42,14 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm 
implements ReplicaLoadB
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
-        return readDataSourceNames.get(Math.abs(count.getAndIncrement()) % 
readDataSourceNames.size());
+        if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+            
TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(Math.abs(count.getAndIncrement())
 % readDataSourceNames.size()));
+        }
+        return TransactionHolder.getReadWriteSplitRoutedReplica();
     }
     
     @Override
     public String getType() {
-        return "ROUND_ROBIN";
-    }
-    
-    @Override
-    public boolean isDefault() {
-        return true;
+        return "FIXED_REPLICA_ROUND_ROBIN";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
similarity index 88%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
index db95e3c9cad..e77bd7b4452 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.Arrays;
 import java.util.List;
@@ -27,10 +28,10 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Weight replica load-balance algorithm.
+ * Fixed replica weight load-balance algorithm.
  */
 @Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaWeightLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private static final double ACCURACY_THRESHOLD = 0.0001;
     
@@ -47,7 +48,10 @@ public final class WeightReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
         double[] weight = WEIGHT_MAP.containsKey(name) ? WEIGHT_MAP.get(name) 
: initWeight(readDataSourceNames);
         WEIGHT_MAP.putIfAbsent(name, weight);
-        return getDataSourceName(readDataSourceNames, weight);
+        if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+            
TransactionHolder.setReadWriteSplitRoutedReplica(getDataSourceName(readDataSourceNames,
 weight));
+        }
+        return TransactionHolder.getReadWriteSplitRoutedReplica();
     }
     
     private String getDataSourceName(final List<String> readDataSourceNames, 
final double[] weight) {
@@ -118,6 +122,6 @@ public final class WeightReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getType() {
-        return "WEIGHT";
+        return "FIXED_REPLICA_WEIGHT";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
index 14c53b1a190..4542892c3f1 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.List;
 import java.util.Properties;
@@ -28,7 +29,7 @@ import java.util.concurrent.ThreadLocalRandom;
  * Random replica load-balance algorithm.
  */
 @Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class RandomReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private Properties props = new Properties();
     
@@ -39,6 +40,9 @@ public final class RandomReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
+        if (TransactionHolder.isTransaction()) {
+            return writeDataSourceName;
+        }
         return 
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
index 69a40a18c99..e67517ca4e2 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.List;
 import java.util.Properties;
@@ -27,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 /**
  * Round-robin replica load-balance algorithm.
  */
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class RoundRobinReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private final AtomicInteger count = new AtomicInteger(0);
     
@@ -41,6 +42,9 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm 
implements ReplicaLoadB
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
+        if (TransactionHolder.isTransaction()) {
+            return writeDataSourceName;
+        }
         return readDataSourceNames.get(Math.abs(count.getAndIncrement()) % 
readDataSourceNames.size());
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
similarity index 83%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
index 14c53b1a190..a11b17e5a80 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
@@ -18,17 +18,17 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Random replica load-balance algorithm.
+ * Transaction random replica load-balance algorithm.
  */
 @Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class TransactionRandomReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private Properties props = new Properties();
     
@@ -44,6 +44,6 @@ public final class RandomReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getType() {
-        return "RANDOM";
+        return "TRANSACTION_RANDOM";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
similarity index 81%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
index 69a40a18c99..54849c67f29 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
@@ -18,16 +18,16 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * Round-robin replica load-balance algorithm.
+ * Transaction round-robin replica load-balance algorithm.
  */
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class TransactionRoundRobinReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private final AtomicInteger count = new AtomicInteger(0);
     
@@ -46,11 +46,6 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm 
implements ReplicaLoadB
     
     @Override
     public String getType() {
-        return "ROUND_ROBIN";
-    }
-    
-    @Override
-    public boolean isDefault() {
-        return true;
+        return "TRANSACTION_ROUND_ROBIN";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
similarity index 94%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
index db95e3c9cad..e0756962019 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.Arrays;
 import java.util.List;
@@ -27,10 +27,10 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Weight replica load-balance algorithm.
+ * Transaction weight replica load-balance algorithm.
  */
 @Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class TransactionWeightReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private static final double ACCURACY_THRESHOLD = 0.0001;
     
@@ -118,6 +118,6 @@ public final class WeightReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getType() {
-        return "WEIGHT";
+        return "TRANSACTION_WEIGHT";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
index db95e3c9cad..9e8f8f79825 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 
 import java.util.Arrays;
 import java.util.List;
@@ -30,7 +31,7 @@ import java.util.concurrent.ThreadLocalRandom;
  * Weight replica load-balance algorithm.
  */
 @Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements 
ReplicaLoadBalanceAlgorithm {
+public final class WeightReplicaLoadBalanceAlgorithm implements 
ReadQueryLoadBalanceAlgorithm {
     
     private static final double ACCURACY_THRESHOLD = 0.0001;
     
@@ -45,6 +46,9 @@ public final class WeightReplicaLoadBalanceAlgorithm 
implements ReplicaLoadBalan
     
     @Override
     public String getDataSource(final String name, final String 
writeDataSourceName, final List<String> readDataSourceNames) {
+        if (TransactionHolder.isTransaction()) {
+            return writeDataSourceName;
+        }
         double[] weight = WEIGHT_MAP.containsKey(name) ? WEIGHT_MAP.get(name) 
: initWeight(readDataSourceNames);
         WEIGHT_MAP.putIfAbsent(name, weight);
         return getDataSourceName(readDataSourceNames, weight);
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
index 61f95f070b9..2521da11bfa 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
@@ -26,7 +26,6 @@ import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataS
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
-import org.apache.shardingsphere.transaction.TransactionHolder;
 
 /**
  * Data source router for readwrite-splitting.
@@ -44,16 +43,13 @@ public final class ReadwriteSplittingDataSourceRouter {
      */
     public String route(final SQLStatementContext<?> sqlStatementContext) {
         if (isPrimaryRoute(sqlStatementContext)) {
-            return rule.getReadwriteSplittingStrategy().getWriteDataSource();
-        }
-        if (1 == rule.getReadDataSourceNames().size()) {
-            return rule.getReadDataSourceNames().get(0);
+            return rule.getWriteDataSource();
         }
         return rule.getLoadBalancer().getDataSource(rule.getName(), 
rule.getWriteDataSource(), rule.getReadDataSourceNames());
     }
     
     private boolean isPrimaryRoute(final SQLStatementContext<?> 
sqlStatementContext) {
-        return isWriteRouteStatement(sqlStatementContext) || 
isHintWriteRouteOnly(sqlStatementContext) || TransactionHolder.isTransaction();
+        return isWriteRouteStatement(sqlStatementContext) || 
isHintWriteRouteOnly(sqlStatementContext);
     }
     
     private boolean isWriteRouteStatement(final SQLStatementContext<?> 
sqlStatementContext) {
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
index 8e6e8d55114..92cf32b66a0 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
@@ -23,7 +23,7 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.distsql.constant.ExportableConstants;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.strategy.ReadwriteSplittingStrategy;
 import 
org.apache.shardingsphere.readwritesplitting.strategy.ReadwriteSplittingStrategyFactory;
 
@@ -43,14 +43,14 @@ public final class ReadwriteSplittingDataSourceRule {
     
     private final String name;
     
-    private final ReplicaLoadBalanceAlgorithm loadBalancer;
+    private final ReadQueryLoadBalanceAlgorithm loadBalancer;
     
     private final ReadwriteSplittingStrategy readwriteSplittingStrategy;
     
     @Getter(AccessLevel.NONE)
     private final Collection<String> disabledDataSourceNames = new HashSet<>();
     
-    public ReadwriteSplittingDataSourceRule(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
ReplicaLoadBalanceAlgorithm loadBalancer) {
+    public ReadwriteSplittingDataSourceRule(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
ReadQueryLoadBalanceAlgorithm loadBalancer) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(config.getName()), 
"Name is required.");
         name = config.getName();
         this.loadBalancer = loadBalancer;
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 1329a48eb13..e243c969499 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -30,7 +30,7 @@ import 
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmPr
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.strategy.type.DynamicReadwriteSplittingStrategy;
 import 
org.apache.shardingsphere.readwritesplitting.strategy.type.StaticReadwriteSplittingStrategy;
 
@@ -48,7 +48,7 @@ import java.util.stream.Collectors;
  */
 public final class ReadwriteSplittingRule implements SchemaRule, 
DataSourceContainedRule, StatusContainedRule, ExportableRule {
     
-    private final Map<String, ReplicaLoadBalanceAlgorithm> loadBalancers = new 
LinkedHashMap<>();
+    private final Map<String, ReadQueryLoadBalanceAlgorithm> loadBalancers = 
new LinkedHashMap<>();
     
     private final Map<String, ReadwriteSplittingDataSourceRule> 
dataSourceRules;
     
@@ -58,7 +58,7 @@ public final class ReadwriteSplittingRule implements 
SchemaRule, DataSourceConta
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
             // TODO check if can not find load balancer should throw exception.
-            ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
+            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
                     ? ReplicaLoadBalanceAlgorithmFactory.newInstance()
                     : loadBalancers.get(each.getLoadBalancerName());
             dataSourceRules.put(each.getName(), new 
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
@@ -71,7 +71,7 @@ public final class ReadwriteSplittingRule implements 
SchemaRule, DataSourceConta
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
             // TODO check if can not find load balancer should throw exception.
-            ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
+            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
                     ? ReplicaLoadBalanceAlgorithmFactory.newInstance()
                     : loadBalancers.get(each.getLoadBalancerName());
             dataSourceRules.put(each.getName(), new 
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
similarity index 58%
rename from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
rename to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
index 568ee150ab8..ebcc94ee806 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
@@ -18,3 +18,10 @@
 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RoundRobinReplicaLoadBalanceAlgorithm
 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReplicaLoadBalanceAlgorithm
 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.WeightReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedPrimaryLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaRandomLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaRoundRobinLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaWeightLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionRandomReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionRoundRobinReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionWeightReplicaLoadBalanceAlgorithm
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
similarity index 65%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
index 261312fd595..529cc0ca3a0 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
@@ -22,11 +22,12 @@ import org.junit.Test;
 import java.util.Arrays;
 import java.util.List;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
 
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedPrimaryLoadBalanceAlgorithmTest {
     
-    private final RandomReplicaLoadBalanceAlgorithm 
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+    private final FixedPrimaryLoadBalanceAlgorithm 
fixedPrimaryLoadBalanceAlgorithm = new FixedPrimaryLoadBalanceAlgorithm();
     
     @Test
     public void assertGetDataSource() {
@@ -34,8 +35,6 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
         String readDataSourceName1 = "test_replica_ds_1";
         String readDataSourceName2 = "test_replica_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        assertThat(fixedPrimaryLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
similarity index 56%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
index 261312fd595..7c26fb4848e 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
@@ -17,16 +17,19 @@
 
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.List;
 
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
 
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaRandomLoadBalanceAlgorithmTest {
     
-    private final RandomReplicaLoadBalanceAlgorithm 
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+    private final FixedReplicaRandomLoadBalanceAlgorithm 
fixedReplicaRandomLoadBalanceAlgorithm = new 
FixedReplicaRandomLoadBalanceAlgorithm();
     
     @Test
     public void assertGetDataSource() {
@@ -34,8 +37,11 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
         String readDataSourceName1 = "test_replica_ds_1";
         String readDataSourceName2 = "test_replica_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        TransactionHolder.setInTransaction();
+        String routeDatasource = 
fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, 
readDataSourceNames);
+        
assertTrue(readDataSourceNames.contains(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        assertThat(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        assertThat(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        TransactionHolder.clear();
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
similarity index 52%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
index 261312fd595..fa651d6ca71 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
@@ -17,16 +17,19 @@
 
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.List;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaRoundRobinLoadBalanceAlgorithmTest {
     
-    private final RandomReplicaLoadBalanceAlgorithm 
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+    private final FixedReplicaRoundRobinLoadBalanceAlgorithm 
fixedReplicaRoundRobinLoadBalanceAlgorithm = new 
FixedReplicaRoundRobinLoadBalanceAlgorithm();
     
     @Test
     public void assertGetDataSource() {
@@ -34,8 +37,12 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
         String readDataSourceName1 = "test_replica_ds_1";
         String readDataSourceName2 = "test_replica_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        TransactionHolder.setInTransaction();
+        String routeDatasource = 
fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames);
+        
assertTrue(readDataSourceNames.contains(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        TransactionHolder.clear();
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
similarity index 54%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
index ba811bd6cc1..581efae1970 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -30,25 +31,28 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
 
-public final class WeightReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaWeightLoadBalanceAlgorithmTest {
     
     @SuppressWarnings("rawtypes")
     @Before
     @After
     public void reset() throws NoSuchFieldException, IllegalAccessException {
-        Field accuracyThresholdField = 
WeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
+        Field accuracyThresholdField = 
FixedReplicaWeightLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
         accuracyThresholdField.setAccessible(true);
-        ((Map) 
accuracyThresholdField.get(WeightReplicaLoadBalanceAlgorithm.class)).clear();
+        ((Map) 
accuracyThresholdField.get(FixedReplicaWeightLoadBalanceAlgorithm.class)).clear();
     }
     
     @Test
     public void assertGetSingleReadDataSource() {
-        WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
"test_write_ds", Collections.singletonList("test_read_ds_1")), 
is("test_read_ds_1"));
+        FixedReplicaWeightLoadBalanceAlgorithm 
fixedReplicaWeightLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
+        TransactionHolder.isTransaction();
+        String routeDatasource = 
fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", "test_write_ds", 
Collections.singletonList("test_read_ds_1"));
+        assertThat(routeDatasource, is("test_read_ds_1"));
+        assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", 
"test_write_ds", Collections.singletonList("test_read_ds_1")), 
is(routeDatasource));
+        TransactionHolder.clear();
     }
     
     private Properties createSingleDataSourceProperties() {
@@ -59,14 +63,17 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
     
     @Test
     public void assertGetMultipleReadDataSources() {
-        WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+        FixedReplicaWeightLoadBalanceAlgorithm 
fixedReplicaWeightLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
         String writeDataSourceName = "test_write_ds";
         String readDataSourceName1 = "test_read_ds_1";
         String readDataSourceName2 = "test_read_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
+        TransactionHolder.setInTransaction();
+        String routeDatasource = 
fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", "test_write_ds", 
readDataSourceNames);
+        assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+        TransactionHolder.clear();
     }
     
     private Properties createMultipleDataSourcesProperties() {
@@ -76,7 +83,7 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
         return result;
     }
     
-    private WeightReplicaLoadBalanceAlgorithm 
createReplicaLoadBalanceAlgorithm(final Properties props) {
-        return (WeightReplicaLoadBalanceAlgorithm) 
ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
+    private FixedReplicaWeightLoadBalanceAlgorithm 
createReplicaLoadBalanceAlgorithm(final Properties props) {
+        return (FixedReplicaWeightLoadBalanceAlgorithm) 
ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration("FIXED_REPLICA_WEIGHT", props));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
index 261312fd595..60d6be76e7a 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -29,7 +30,18 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
     private final RandomReplicaLoadBalanceAlgorithm 
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
     
     @Test
-    public void assertGetDataSource() {
+    public void assertGetDataSourceInTransaction() {
+        String writeDataSourceName = "test_write_ds";
+        String readDataSourceName1 = "test_replica_ds_1";
+        String readDataSourceName2 = "test_replica_ds_2";
+        List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
+        TransactionHolder.setInTransaction();
+        
assertTrue(writeDataSourceName.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        TransactionHolder.clear();
+    }
+    
+    @Test
+    public void assertGetDataSourceNotInTransaction() {
         String writeDataSourceName = "test_write_ds";
         String readDataSourceName1 = "test_replica_ds_1";
         String readDataSourceName2 = "test_replica_ds_2";
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
index 71a54b23e44..63445693b90 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -38,4 +39,16 @@ public final class RoundRobinReplicaLoadBalanceAlgorithmTest 
{
         assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
         assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
     }
+    
+    @Test
+    public void assertGetDataSourceInTransaction() {
+        String writeDataSourceName = "test_write_ds";
+        String readDataSourceName1 = "test_read_ds_1";
+        String readDataSourceName2 = "test_read_ds_2";
+        RoundRobinReplicaLoadBalanceAlgorithm 
roundRobinReplicaLoadBalanceAlgorithm = new 
RoundRobinReplicaLoadBalanceAlgorithm();
+        List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
+        TransactionHolder.setInTransaction();
+        assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
+        TransactionHolder.clear();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
similarity index 58%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
index 261312fd595..2e398c4b620 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -24,18 +25,20 @@ import java.util.List;
 
 import static org.junit.Assert.assertTrue;
 
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class TransactionRandomReplicaLoadBalanceAlgorithmTest {
     
-    private final RandomReplicaLoadBalanceAlgorithm 
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+    private final TransactionRandomReplicaLoadBalanceAlgorithm 
transactionRandomReplicaLoadBalanceAlgorithm = new 
TransactionRandomReplicaLoadBalanceAlgorithm();
     
     @Test
-    public void assertGetDataSource() {
+    public void assertGetDataSourceInTransaction() {
         String writeDataSourceName = "test_write_ds";
         String readDataSourceName1 = "test_replica_ds_1";
         String readDataSourceName2 = "test_replica_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
-        
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        TransactionHolder.setInTransaction();
+        
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        TransactionHolder.clear();
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
new file mode 100644
index 00000000000..8f0ed0299b8
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+
+import org.apache.shardingsphere.transaction.TransactionHolder;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class TransactionRoundRobinReplicaLoadBalanceAlgorithmTest {
+    
+    @Test
+    public void assertGetDataSource() {
+        String writeDataSourceName = "test_write_ds";
+        String readDataSourceName1 = "test_read_ds_1";
+        String readDataSourceName2 = "test_read_ds_2";
+        TransactionRoundRobinReplicaLoadBalanceAlgorithm 
transactionRoundRobinReplicaLoadBalanceAlgorithm = new 
TransactionRoundRobinReplicaLoadBalanceAlgorithm();
+        List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+    }
+    
+    @Test
+    public void assertGetDataSourceInTransaction() {
+        String writeDataSourceName = "test_write_ds";
+        String readDataSourceName1 = "test_read_ds_1";
+        String readDataSourceName2 = "test_read_ds_2";
+        TransactionRoundRobinReplicaLoadBalanceAlgorithm 
transactionRoundRobinReplicaLoadBalanceAlgorithm = new 
TransactionRoundRobinReplicaLoadBalanceAlgorithm();
+        List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
+        TransactionHolder.setInTransaction();
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
+        
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+        TransactionHolder.clear();
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
similarity index 55%
copy from 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
index ba811bd6cc1..ddad750e81a 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -33,22 +34,25 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
-public final class WeightReplicaLoadBalanceAlgorithmTest {
+public final class TransactionWeightReplicaLoadBalanceAlgorithmTest {
     
     @SuppressWarnings("rawtypes")
     @Before
     @After
     public void reset() throws NoSuchFieldException, IllegalAccessException {
-        Field accuracyThresholdField = 
WeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
+        Field accuracyThresholdField = 
TransactionWeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
         accuracyThresholdField.setAccessible(true);
-        ((Map) 
accuracyThresholdField.get(WeightReplicaLoadBalanceAlgorithm.class)).clear();
+        ((Map) 
accuracyThresholdField.get(TransactionWeightReplicaLoadBalanceAlgorithm.class)).clear();
     }
     
     @Test
     public void assertGetSingleReadDataSource() {
-        WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
"test_write_ds", Collections.singletonList("test_read_ds_1")), 
is("test_read_ds_1"));
+        TransactionWeightReplicaLoadBalanceAlgorithm 
transactionWeightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
+        TransactionHolder.setInTransaction();
+        
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
"test_write_ds", Collections.singletonList("test_read_ds_1")), 
is("test_read_ds_1"));
+        TransactionHolder.clear();
     }
     
     private Properties createSingleDataSourceProperties() {
@@ -59,14 +63,17 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
     
     @Test
     public void assertGetMultipleReadDataSources() {
-        WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+        TransactionWeightReplicaLoadBalanceAlgorithm 
transactionWeightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
         String writeDataSourceName = "test_write_ds";
         String readDataSourceName1 = "test_read_ds_1";
         String readDataSourceName2 = "test_read_ds_2";
         List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
-        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
+        TransactionHolder.setInTransaction();
+        
assertTrue(readDataSourceNames.contains(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
 writeDataSourceName, readDataSourceNames)));
+        
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
+        
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
+        
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), notNullValue());
+        TransactionHolder.clear();
     }
     
     private Properties createMultipleDataSourcesProperties() {
@@ -76,7 +83,7 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
         return result;
     }
     
-    private WeightReplicaLoadBalanceAlgorithm 
createReplicaLoadBalanceAlgorithm(final Properties props) {
-        return (WeightReplicaLoadBalanceAlgorithm) 
ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
+    private TransactionWeightReplicaLoadBalanceAlgorithm 
createReplicaLoadBalanceAlgorithm(final Properties props) {
+        return (TransactionWeightReplicaLoadBalanceAlgorithm) 
ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration("TRANSACTION_WEIGHT", props));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
index ba811bd6cc1..d6d8094da91 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -79,4 +80,16 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
     private WeightReplicaLoadBalanceAlgorithm 
createReplicaLoadBalanceAlgorithm(final Properties props) {
         return (WeightReplicaLoadBalanceAlgorithm) 
ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
     }
+    
+    @Test
+    public void assertGetReadDataSourceInTransaction() {
+        WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm = 
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+        String writeDataSourceName = "test_write_ds";
+        String readDataSourceName1 = "test_read_ds_1";
+        String readDataSourceName2 = "test_read_ds_2";
+        List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, 
readDataSourceName2);
+        TransactionHolder.setInTransaction();
+        assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds", 
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
+        TransactionHolder.clear();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/read
 [...]
index 85cfb7007fa..65cc6ab9998 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
@@ -20,7 +20,7 @@ package 
org.apache.shardingsphere.readwritesplitting.spring.boot;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.spring.boot.algorithm.ReadwriteSplittingAlgorithmProvidedBeanRegistry;
 import 
org.apache.shardingsphere.readwritesplitting.spring.boot.condition.ReadwriteSplittingSpringBootCondition;
 import 
org.apache.shardingsphere.readwritesplitting.spring.boot.rule.YamlReadwriteSplittingRuleSpringBootConfiguration;
@@ -59,9 +59,9 @@ public class ReadwriteSplittingRuleSpringbootConfiguration {
      * @return readwrite-splitting rule configuration
      */
     @Bean
-    public RuleConfiguration readWriteSplittingRuleConfiguration(final 
ObjectProvider<Map<String, ReplicaLoadBalanceAlgorithm>> loadBalanceAlgorithms) 
{
+    public RuleConfiguration readWriteSplittingRuleConfiguration(final 
ObjectProvider<Map<String, ReadQueryLoadBalanceAlgorithm>> 
loadBalanceAlgorithms) {
         AlgorithmProvidedReadwriteSplittingRuleConfiguration result = 
swapper.swapToObject(yamlConfig.getReadwriteSplitting());
-        Map<String, ReplicaLoadBalanceAlgorithm> balanceAlgorithmMap = 
Optional.ofNullable(loadBalanceAlgorithms.getIfAvailable()).orElse(Collections.emptyMap());
+        Map<String, ReadQueryLoadBalanceAlgorithm> balanceAlgorithmMap = 
Optional.ofNullable(loadBalanceAlgorithms.getIfAvailable()).orElse(Collections.emptyMap());
         result.setLoadBalanceAlgorithms(balanceAlgorithmMap);
         return result;
     }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardin
 [...]
index e42c10bb1ab..d7a6244dc19 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.readwritesplitting.spring.boot.algorithm;
 
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.core.env.Environment;
@@ -25,7 +25,7 @@ import org.springframework.core.env.Environment;
 /**
  * Readwrite-splitting algorithm provided bean registry.
  */
-public final class ReadwriteSplittingAlgorithmProvidedBeanRegistry extends 
AbstractAlgorithmProvidedBeanRegistry<ReplicaLoadBalanceAlgorithm> {
+public final class ReadwriteSplittingAlgorithmProvidedBeanRegistry extends 
AbstractAlgorithmProvidedBeanRegistry<ReadQueryLoadBalanceAlgorithm> {
     
     private static final String ALGORITHMS = 
"spring.shardingsphere.rules.readwrite-splitting.load-balancers.";
     
@@ -40,6 +40,6 @@ public final class 
ReadwriteSplittingAlgorithmProvidedBeanRegistry extends Abstr
     
     @Override
     public void postProcessBeanDefinitionRegistry(final BeanDefinitionRegistry 
registry) {
-        registerBean(ALGORITHMS, ReplicaLoadBalanceAlgorithm.class, registry);
+        registerBean(ALGORITHMS, ReadQueryLoadBalanceAlgorithm.class, 
registry);
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/
 [...]
index 95a29e054dc..9578570c158 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.readwritesplitting.spring.namespace.factorybea
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.spring.namespace.factorybean.ShardingSphereAlgorithmFactoryBean;
 
 import java.util.Properties;
@@ -27,14 +27,14 @@ import java.util.Properties;
 /**
  * Replica load balance algorithm factory bean.
  */
-public final class ReplicaLoadBalanceAlgorithmFactoryBean extends 
ShardingSphereAlgorithmFactoryBean<ReplicaLoadBalanceAlgorithm> {
+public final class ReplicaLoadBalanceAlgorithmFactoryBean extends 
ShardingSphereAlgorithmFactoryBean<ReadQueryLoadBalanceAlgorithm> {
     
     public ReplicaLoadBalanceAlgorithmFactoryBean(final String type, final 
Properties props) {
-        super(type, props, ReplicaLoadBalanceAlgorithm.class);
+        super(type, props, ReadQueryLoadBalanceAlgorithm.class);
     }
     
     @Override
-    public ReplicaLoadBalanceAlgorithm getObject() {
+    public ReadQueryLoadBalanceAlgorithm getObject() {
         return ReplicaLoadBalanceAlgorithmFactory.newInstance(new 
ShardingSphereAlgorithmConfiguration(getType(), getProps()));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritespli
 [...]
index 199159bea92..fbd01f1b127 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
@@ -20,7 +20,7 @@ package 
org.apache.shardingsphere.readwritesplitting.spring.namespace;
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReplicaLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 import org.junit.Test;
 import org.springframework.test.context.ContextConfiguration;
 import 
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
@@ -36,7 +36,7 @@ import static org.junit.Assert.assertThat;
 public final class ReadwriteSplittingSpringNamespaceTest extends 
AbstractJUnit4SpringContextTests {
     
     @Resource
-    private ReplicaLoadBalanceAlgorithm randomLoadbalancer;
+    private ReadQueryLoadBalanceAlgorithm randomLoadbalancer;
     
     @Resource
     private AlgorithmProvidedReadwriteSplittingRuleConfiguration defaultRule;
@@ -56,7 +56,7 @@ public final class ReadwriteSplittingSpringNamespaceTest 
extends AbstractJUnit4S
         
assertDefaultDataSourceRule(defaultRule.getDataSources().iterator().next());
     }
     
-    private void assertLoadBalancers(final Map<String, 
ReplicaLoadBalanceAlgorithm> loadBalances) {
+    private void assertLoadBalancers(final Map<String, 
ReadQueryLoadBalanceAlgorithm> loadBalances) {
         assertThat(loadBalances.size(), is(1));
         assertThat(loadBalances.get("randomLoadbalancer"), 
instanceOf(RandomReplicaLoadBalanceAlgorithm.class));
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
 
b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
index 81e358079e8..8f72e52cf44 100644
--- 
a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
+++ 
b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
@@ -30,6 +30,8 @@ public final class TransactionHolder {
     
     private static final ThreadLocal<Boolean> TRANSACTION = 
ThreadLocal.withInitial(() -> false);
     
+    private static final ThreadLocal<String> 
READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER = new ThreadLocal<>();
+    
     /**
      * Judge is transaction in current thread.
      * 
@@ -46,10 +48,29 @@ public final class TransactionHolder {
         TRANSACTION.set(true);
     }
     
+    /**
+     * Get read write split routed replica.
+     *
+     * @return routed replica.
+     */
+    public static String getReadWriteSplitRoutedReplica() {
+        return READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.get();
+    }
+    
+    /**
+     * Set read write split routed replica.
+     *
+     * @param replica routed replica.
+     */
+    public static void setReadWriteSplitRoutedReplica(final String replica) {
+        READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.set(replica);
+    }
+    
     /**
      * Clear transaction.
      */
     public static void clear() {
         TRANSACTION.remove();
+        READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.remove();
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
index 4e5b4a7ebdf..2f0e2b7ec03 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
@@ -61,6 +61,10 @@
 #      props:
 #        write-data-source-name: primary_ds
 #        read-data-source-names: replica_ds_0,replica_ds_1
+#      loadBalancerName: random
+#  loadBalancers:
+#    random:
+#      type: RANDOM
 
 
######################################################################################################
 #
@@ -107,3 +111,7 @@
 #      props:
 #        write-data-source-name: write_ds
 #        read-data-source-names: read_ds_0,read_ds_1
+#      loadBalancerName: random
+#  loadBalancers:
+#    random:
+#      type: RANDOM

Reply via email to