diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md index 3aba211b51b89..6a66f116c50e5 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md @@ -99,16 +99,16 @@ client { 根据实际场景修改 Seata 的 `file.conf` 和 `registry.conf` 文件。 -### 使用限制 +## 使用限制 ShardingSphere 的 Seata 集成不支持隔离级别。 ShardingSphere 的 Seata 集成将获取到的 Seata 全局事务置入线程的局部变量。 而 `org.apache.seata.spring.annotation.GlobalTransactionScanner` 则是采用 Dynamic Proxy 的方式对方法进行增强。 -这意味着用户始终不应该针对 ShardingSphere 的 DataSource 使用 `io.seata:seata-spring-boot-starter` 的注解。 -即在使用 ShardingSphere 的 Seata 集成时,用户应避免使用 `io.seata:seata-spring-boot-starter` 的 Maven 依赖。 +这意味着用户始终不应该针对 ShardingSphere 的 DataSource 使用 `io.seata:seata-all` 的 Java 注解。 +即在使用 ShardingSphere 的 Seata 集成时,用户应避免使用 `io.seata:seata-all` 的 Java API。 -针对 ShardingSphere 数据源,讨论 5 种情况, +针对 ShardingSphere 数据源,讨论 6 种情况, 1. 手动获取从 ShardingSphere 数据源创建的 `java.sql.Connection` 实例, 并手动调用 `setAutoCommit()`, `commit()` 和 `rollback()` 方法,这是被允许的。 @@ -119,9 +119,80 @@ ShardingSphere 的 Seata 集成将获取到的 Seata 全局事务置入线程的 4. 在函数上使用 Spring Framework 的 `org.springframework.transaction.annotation.Transactional` 注解,这是被允许的。 -5. 在函数上使用 `io.seata.spring.annotation.GlobalTransactional` 注解,这是不被允许的。 +5. 在函数上使用 `io.seata.spring.annotation.GlobalTransactional` 注解,这是**不被允许的**。 6. 手动从 `io.seata.tm.api.GlobalTransactionContext ` 创建 `io.seata.tm.api.GlobalTransaction` 实例, -调用 `io.seata.tm.api.GlobalTransaction` 实例的 `begin()`, `commit()` 和 `rollback()` 方法,这是不被允许的。 +调用 `io.seata.tm.api.GlobalTransaction` 实例的 `begin()`, `commit()` 和 `rollback()` 方法,这是**不被允许的**。 -长话短说,在使用 ShardingSphere 的 Seata 集成时,你不应该使用 Seata Java API。 +对于Seata Server 2.0.0, +Seata Server 不会为同一 **transaction group** 的所有已连接的 Seata Client 实例传递 `io.seata.core.context.RootContext.getXID()` 的返回值, +参考 https://seata.apache.org/docs/user/api/ 。 +这需要讨论两种情况, + +1. 在使用 ShardingSphere JDBC 的场景下, + 跨多个微服务的事务场景需要考虑在起点微服务的上下文使用 `io.seata.core.context.RootContext.getXID()` 获取 Seata XID 后通过 RPC 传递给终点微服务, + 并在终点微服务的业务函数中调用 `io.seata.core.context.RootContext.bind(rpcXid)`。 + +2. 在使用 ShardingSphere Proxy 的场景下,多个微服务均对着 ShardingSphere Proxy 的逻辑数据源操作本地事务, + 这将在 ShardingSphere Proxy 的服务端来转化为对分布式事务的操作,不需要考虑额外的 Seata XID。 + +在使用 Spring Boot OSS 的实际情景中, +`com.alibaba.cloud:spring-cloud-starter-alibaba-seata` 和 `io.seata:seata-spring-boot-starter` 常常被其他 Maven 依赖传递引入。 +为了避开事务冲突,你需要手动关闭 Seata 的自动配置类, +并在 Spring Boot OSS 的配置文件中将 `seata.enable-auto-data-source-proxy` 的属性置为 `false`。一个可能的依赖关系如下。 + +```xml + + + + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere.version} + + + org.apache.shardingsphere + shardingsphere-transaction-base-seata-at + ${shardingsphere.version} + + + io.seata + seata-spring-boot-starter + 2.0.0 + + + org.antlr + antlr4-runtime + + + + + +``` + +对应的 Spring Boot OSS 启动类可能如下。 + +```java +import io.seata.spring.boot.autoconfigure.SeataAutoConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(exclude = SeataAutoConfiguration.class) +public class ExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(ShardingsphereSeataSpringBootTestApplication.class, args); + } + +} +``` + +classpath 下对应的 `application.yml` 需要包含以下配置。 +在此情况下,在 Spring Boot OSS 的 `application.yaml` 内定义 Seata 的 `registry.conf` 的等价配置不一定有效。 +这取决于 Seata Client。 +当下游项目使用 `org.apache.shardingsphere:shardingsphere-transaction-base-seata-at` 的 Maven 模块时, +总是被鼓励使用 `registry.conf` 配置 Seata Client。 + +```yaml +seata: + enable-auto-data-source-proxy: false +``` diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md index 22d58d09d5fa4..e2ef1b63fe5cd 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md @@ -100,16 +100,16 @@ client { Modify the `file.conf` and `registry.conf` files of Seata as required. -### Usage restrictions +## Usage restrictions ShardingSphere's Seata integration does not support isolation levels. ShardingSphere's Seata integration places the obtained Seata global transaction into the thread's local variables. And `org.apache.seata.spring.annotation.GlobalTransactionScanner` uses Dynamic Proxy to enhance the method. -This means that users should never use the `io.seata:seata-spring-boot-starter` annotation for ShardingSphere's DataSource. -That is, when using ShardingSphere's Seata integration, users should avoid using the Maven dependency of `io.seata:seata-spring-boot-starter`. +This means that users should never use the `io.seata:seata-all` Java annotation for ShardingSphere's DataSource. +That is, when using ShardingSphere's Seata integration, users should avoid using the Java API of `io.seata:seata-all`. -For ShardingSphere data source, discuss 5 situations, +For ShardingSphere data source, discuss 6 situations, 1. Manually obtain the `java.sql.Connection` instance created from the ShardingSphere data source, and manually calling the `setAutoCommit()`, `commit()` and `rollback()` methods is allowed. @@ -120,9 +120,83 @@ For ShardingSphere data source, discuss 5 situations, 4. Using Spring Framework’s `org.springframework.transaction.annotation.Transactional` annotation on functions is allowed. -5. Using the `io.seata.spring.annotation.GlobalTransactional` annotation on the function is not allowed. +5. Using the `io.seata.spring.annotation.GlobalTransactional` annotation on the function is **not allowed**. 6. Manually create `io.seata.tm.api.GlobalTransaction` instance from `io.seata.tm.api.GlobalTransactionContext`, -calling the `begin()`, `commit()` and `rollback()` methods of an `io.seata.tm.api.GlobalTransaction` instance is not allowed. +calling the `begin()`, `commit()` and `rollback()` methods of an `io.seata.tm.api.GlobalTransaction` instance is **not allowed**. -Long story short, you should not use the Seata Java API when using ShardingSphere's Seata integration. +For Seata Server 2.0.0, +Seata Server does not pass the return value of `io.seata.core.context.RootContext.getXID()` to all connected Seata Client instances of the same **transaction group**, +Reference https://seata.apache.org/docs/user/api/ . +This requires discussing two situations, + +1. In the scenario of using ShardingSphere JDBC, + transaction scenarios across multiple microservices need to consider using `io.seata.core.context.RootContext.getXID()` in the context of the starting microservice to obtain the Seata XID and then pass it to the ending microservice through RPC, + and call `io.seata.core.context.RootContext.bind(rpcXid)` in the business function of the endpoint microservice. + +2. In the scenario of using ShardingSphere Proxy, + Multiple microservices operate local transactions against the logical dataSource of ShardingSphere Proxy, + this will be converted into distributed transaction operations on the server side of ShardingSphere Proxy, + there are no additional Seata XIDs to consider. + +In the actual scenario of using Spring Boot OSS, +`com.alibaba.cloud:spring-cloud-starter-alibaba-seata` and `io.seata:seata-spring-boot-starter` are often introduced transitively by other Maven dependencies. +In order to avoid transaction conflicts, users need to manually turn off Seata's auto-config class. +And set the `seata.enable-auto-data-source-proxy` property to `false` in the Spring Boot OSS configuration file. +A possible dependency is as follows. + +```xml + + + + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere.version} + + + org.apache.shardingsphere + shardingsphere-transaction-base-seata-at + ${shardingsphere.version} + + + io.seata + seata-spring-boot-starter + 2.0.0 + + + org.antlr + antlr4-runtime + + + + + +``` + +The corresponding Spring Boot OSS bootstrap class may be as follows. + +```java +import io.seata.spring.boot.autoconfigure.SeataAutoConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(exclude = SeataAutoConfiguration.class) +public class ExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(ShardingsphereSeataSpringBootTestApplication.class, args); + } + +} +``` + +The corresponding `application.yml` under the classpath needs to contain the following configuration. +In this case, the equivalent configuration of Seata's `registry.conf` defined in `application.yaml` of Spring Boot OSS may not be valid. +This depends on the Seata Client. +When a downstream project uses the Maven module `org.apache.shardingsphere:shardingsphere-transaction-base-seata-at`, +users are always encouraged to configure Seata Client using `registry.conf`. + +```yaml +seata: + enable-auto-data-source-proxy: false +``` diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/type/UnsupportedStorageTypeException.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/type/UnsupportedStorageTypeException.java index 95318f825b678..0483b36774675 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/type/UnsupportedStorageTypeException.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/type/UnsupportedStorageTypeException.java @@ -28,17 +28,14 @@ * // CHECKSTYLE:OFF *
  * public final class VerticaDatabaseType implements DatabaseType {
- * 

* @Override * public Collection getJdbcUrlPrefixes() { * return Collections.singleton("jdbc:vertica:"); * } - *

* @Override * public Optional getTrunkDatabaseType() { * return Optional.of(TypedSPILoader.getService(DatabaseType.class, "SQL92")); * } - *

* @Override * public String getType() { * return "Vertica"; diff --git a/infra/expr/spi/src/main/java/org/apache/shardingsphere/infra/expr/spi/InlineExpressionParser.java b/infra/expr/spi/src/main/java/org/apache/shardingsphere/infra/expr/spi/InlineExpressionParser.java index 7de26d6c13b8d..a2d88c86030f7 100644 --- a/infra/expr/spi/src/main/java/org/apache/shardingsphere/infra/expr/spi/InlineExpressionParser.java +++ b/infra/expr/spi/src/main/java/org/apache/shardingsphere/infra/expr/spi/InlineExpressionParser.java @@ -51,6 +51,13 @@ public interface InlineExpressionParser extends TypedSPI { /** * Evaluate with arguments. + * Normally there is no need to use this method downstream, because this method only encapsulates the use of Groovy syntax + * by ShardingSphere's existing algorithm classes. + * An {@link org.apache.shardingsphere.infra.expr.spi.InlineExpressionParser} implementation that implements this method + * will provide the following algorithm classes with the ability to use expressions outside the Groovy language. + * 1. `org.apache.shardingsphere.sharding.algorithm.sharding.hint.HintInlineShardingAlgorithm` + * 2. `org.apache.shardingsphere.sharding.algorithm.sharding.inline.ComplexInlineShardingAlgorithm` + * 3. `org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineShardingAlgorithm` * * @param map map * @return closure