Narayana 事务

背景信息

Apache ShardingSphere 提供 XA 事务,集成了 Narayana 的实现。

前提条件

引入 Maven 依赖

  1. <properties>
  2. <narayana.version>5.12.7.Final</narayana.version>
  3. <jboss-transaction-spi.version>7.6.1.Final</jboss-transaction-spi.version>
  4. <jboss-logging.version>3.2.1.Final</jboss-logging.version>
  5. </properties>
  6. <dependency>
  7. <groupId>org.apache.shardingsphere</groupId>
  8. <artifactId>shardingsphere-jdbc</artifactId>
  9. <version>${shardingsphere.version}</version>
  10. </dependency>
  11. <!-- 使用 XA 事务时,需要引入此模块 -->
  12. <dependency>
  13. <groupId>org.apache.shardingsphere</groupId>
  14. <artifactId>shardingsphere-transaction-xa-core</artifactId>
  15. <version>${shardingsphere.version}</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.shardingsphere</groupId>
  19. <artifactId>shardingsphere-transaction-xa-narayana</artifactId>
  20. <version>${shardingsphere.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.jboss.narayana.jta</groupId>
  24. <artifactId>jta</artifactId>
  25. <version>${narayana.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.jboss.narayana.jts</groupId>
  29. <artifactId>narayana-jts-integration</artifactId>
  30. <version>${narayana.version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.jboss</groupId>
  34. <artifactId>jboss-transaction-spi</artifactId>
  35. <version>${jboss-transaction-spi.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.jboss.logging</groupId>
  39. <artifactId>jboss-logging</artifactId>
  40. <version>${jboss-logging.version}</version>
  41. </dependency>

操作步骤

  1. 配置 Narayana
  2. 设置 XA 事务类型

配置示例

配置 Narayana

可以通过在项目的 classpath 中添加 jbossts-properties.xml 来定制化 Narayana 配置项。

详情请参见 Narayana 官方文档

对于 jbossts-properties.xml 的最小配置,ShardingSphere 要求定义 Narayana 的 CoreEnvironmentBean.nodeIdentifier 属性。 如果 Narayana 的 object store 并非在不同的 Narayana 实例之间共享,你可以将此值设置为 1。一个可能的 jbossts-properties.xml 配置如下,

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <entry key="CoreEnvironmentBean.nodeIdentifier">1</entry>
  5. </properties>

在特定情况下,你可能不会希望使用 XML 文件,那你需要在自有 Java 项目的启动类手动设置 CoreEnvironmentBean.nodeIdentifier。 可参考如下方法调用 Narayana Java API。

  1. import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
  2. import com.arjuna.ats.arjuna.common.arjPropertyManager;
  3. public class ExampleUtils {
  4. public void initNarayanaInstance() {
  5. try {
  6. arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier("1");
  7. } catch (CoreEnvironmentBeanException e) {
  8. throw new RuntimeException(e);
  9. }
  10. }
  11. }

设置 XA 事务类型

Yaml:

  1. transaction:
  2. defaultType: XA
  3. providerType: Narayana