Transactions WSO2数据服务服务器分布式事务无法针对不同类型的数据库回滚

Transactions WSO2数据服务服务器分布式事务无法针对不同类型的数据库回滚,transactions,wso2,distributed,rollback,wso2dss,Transactions,Wso2,Distributed,Rollback,Wso2dss,下面我将测试DSS的分布式事务 没关系。由于addAccountToBank2操作中的错误,addAccountToBank1服务调用回滚。在本试验中,两个操作均涉及H2 DB 然后我做另一个测试: 在这个测试中,我将其中一个H2DB替换为MySQL DB。 以下是我的步骤: 运行begin_boxcar操作 在MySQL数据库中插入一些数据 运行addToAccountBalanceInBank2操作,并为“accountId”字段指定值“1”,为“value”字段指定值“h200” 运行尾车

下面我将测试DSS的分布式事务

没关系。由于addAccountToBank2操作中的错误,addAccountToBank1服务调用回滚。在本试验中,两个操作均涉及H2 DB

然后我做另一个测试:

在这个测试中,我将其中一个H2DB替换为MySQL DB。 以下是我的步骤:

  • 运行begin_boxcar操作
  • 在MySQL数据库中插入一些数据
  • 运行addToAccountBalanceInBank2操作,并为“accountId”字段指定值“1”,为“value”字段指定值“h200”
  • 运行尾车操作
  • 运行getAccountBalanceFromBank2操作。(余额不变)
  • 查询MySQL数据库中的数据。(已通过插入操作更改)
  • 我不知道为什么MySQL数据库没有回滚? DSS的分布式事务回滚需要什么条件

    .dbs文件的内容:

        <data enableBoxcarring="true" enableDTP="true" name="DTPSampleService" serviceNamespace="http://ws.wso2.org/dataservice/samples/dtp_sample">
    <config id="H2DataSource1">
        <property name="org.wso2.ws.dataservice.xa_datasource_class">org.h2.jdbcx.JdbcDataSource</property>
        <property name="org.wso2.ws.dataservice.xa_datasource_properties">
            <property name="URL">jdbc:h2:file:./samples/database/DATA_SERV_SAMP</property>
            <property name="User">wso2ds</property>
            <property name="Password">wso2ds</property>
        </property>
    </config>
    <config id="H2DataSource2">
        <property name="org.wso2.ws.dataservice.xa_datasource_class">org.h2.jdbcx.JdbcDataSource</property>
        <property name="org.wso2.ws.dataservice.xa_datasource_properties">
            <property name="URL">jdbc:h2:file:./samples/database/DATA_SERV_SAMP2</property>
            <property name="User">wso2ds</property>
            <property name="Password">wso2ds</property>
        </property>
    </config>
    <config id="MySQL">
        <property name="org.wso2.ws.dataservice.driver">com.mysql.jdbc.Driver</property>                              
        <property name="org.wso2.ws.dataservice.protocol">jdbc:mysql://localhost:3306/customersdatabase</property>                              
        <property name="org.wso2.ws.dataservice.user">root</property>                              
        <property name="org.wso2.ws.dataservice.password">root123</property>  
        </config>
    <config id="MySQL1">
      <property name="org.wso2.ws.dataservice.driver">com.mysql.jdbc.Driver</property>                              
      <property name="org.wso2.ws.dataservice.protocol">jdbc:mysql://192.168.31.44:3306/guohtdb</property>                              
      <property name="org.wso2.ws.dataservice.user">root</property>                              
      <property name="org.wso2.ws.dataservice.password">root123</property>  
    </config>
    <query id="addAccountToBank1Query" returnGeneratedKeys="true" useConfig="H2DataSource1">
        <sql>insert into Accounts (balance) values (:balance)</sql>
        <param defaultValue="0" name="balance" sqlType="DOUBLE"/>
        <result element="GeneratedKeys" rowName="Entry" useColumnNumbers="true">
            <element column="1" name="ID" xsdType="integer"/>
        </result>
    </query>
    <operation name="addAccountToBank1">
        <call-query href="addAccountToBank1Query">
            <with-param name="balance" query-param="balance"/>
        </call-query>
    </operation>
    <query id="addToAccountBalanceInBank1Query" useConfig="H2DataSource1">
        <sql>update Accounts set balance = balance + :value where accountId= :accountId</sql>
        <param name="accountId" sqlType="INTEGER"/>
        <param name="value" sqlType="DOUBLE">
            <validateDoubleRange maximum="2000" minimum="-2000"/>
        </param>
    </query>
    <operation name="addToAccountBalanceInBank1">
        <call-query href="addToAccountBalanceInBank1Query">
            <with-param name="accountId" query-param="accountId"/>
            <with-param name="value" query-param="value"/>
        </call-query>
    </operation>
    <query id="getAccountBalanceFromBank1Query" useConfig="H2DataSource1">
        <sql>select balance from Accounts where accountId=:accountId</sql>
        <param name="accountId" sqlType="INTEGER"/>
        <result element="Balance">
            <element column="balance" name="Value" xsdType="double"/>
        </result>
    </query>
    <operation name="getAccountBalanceFromBank1">
        <call-query href="getAccountBalanceFromBank1Query">
            <with-param name="accountId" query-param="accountId"/>
        </call-query>
    </operation>
    <query id="addAccountToBank2Query" returnGeneratedKeys="true" useConfig="H2DataSource2">
        <sql>insert into Accounts (balance) values (:balance)</sql>
        <param defaultValue="0" name="balance" sqlType="DOUBLE"/>
        <result element="GeneratedKeys" rowName="Entry" useColumnNumbers="true">
            <element column="1" name="ID" xsdType="integer"/>
        </result>
    </query>
    <operation disableStreaming="true" name="addAccountToBank2">
        <call-query href="addAccountToBank2Query">
            <with-param name="balance" query-param="balance"/>
        </call-query>
    </operation>
    <query id="addToAccountBalanceInBank2Query" useConfig="H2DataSource2">
        <sql>update Accounts set balance = balance + :value where accountId= :accountId</sql>
        <param name="accountId" sqlType="INTEGER"/>
        <param name="value" sqlType="DOUBLE">
            <validateDoubleRange maximum="2000" minimum="-2000"/>
        </param>
    </query>
    <operation name="addToAccountBalanceInBank2">
        <call-query href="addToAccountBalanceInBank2Query">
            <with-param name="accountId" query-param="accountId"/>
            <with-param name="value" query-param="value"/>
        </call-query>
    </operation>
    <query id="getAccountBalanceFromBank2Query" useConfig="H2DataSource2">
        <sql>select balance from Accounts where accountId=:accountId</sql>
        <param name="accountId" sqlType="INTEGER"/>
        <result element="Balance">
            <element column="balance" name="Value" xsdType="double"/>
        </result>
    </query>
    <operation name="getAccountBalanceFromBank2">
        <call-query href="getAccountBalanceFromBank2Query">
            <with-param name="accountId" query-param="accountId"/>
        </call-query>
    </operation>
    <query id="insert_customer_query" useConfig="MySQL">
        <sql>INSERT INTO customer(NID,Name,customerID) VALUES(?,?,?)</sql>
        <param name="NID" ordinal="1" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <param name="Name" ordinal="2" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <param name="customerID" ordinal="3" paramType="SCALAR" sqlType="STRING" type="IN"/>
    </query>
    <operation name="insert_customer_operation">
        <call-query href="insert_customer_query">
            <with-param name="Name" query-param="Name"/>
            <with-param name="customerID" query-param="customerID"/>
            <with-param name="NID" query-param="NID"/>
        </call-query>
    </operation>
    <query id="select_with_key_customer_query" useConfig="MySQL">
        <sql>SELECT NID, Name, customerID FROM customer WHERE customerID=?</sql>
        <param name="customerID" ordinal="1" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <result element="customerCollection" rowName="customer">
            <element column="NID" name="NID" xsdType="xs:string"/>
            <element column="Name" name="Name" xsdType="xs:string"/>
            <element column="customerID" name="customerID" xsdType="xs:string"/>
        </result>
    </query>
    <operation name="select_with_key_customer_operation">
        <call-query href="select_with_key_customer_query">
            <with-param name="customerID" query-param="customerID"/>
        </call-query>
    </operation>
    <query id="select_all_customer_query" useConfig="MySQL">
        <sql>SELECT NID, Name, customerID FROM customer</sql>
        <result element="customerCollection" rowName="customer">
            <element column="NID" name="NID" xsdType="xs:string"/>
            <element column="Name" name="Name" xsdType="xs:string"/>
            <element column="customerID" name="customerID" xsdType="xs:string"/>
        </result>
    </query>
    <operation name="select_all_customer_operation">
        <call-query href="select_all_customer_query"/>
    </operation>   
    <query id="insert_customer_query1" useConfig="MySQL1">
        <sql>INSERT INTO user(NID,Name,customerID) VALUES(?,?,?)</sql>
        <param name="NID" ordinal="1" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <param name="Name" ordinal="2" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <param name="customerID" ordinal="3" paramType="SCALAR" sqlType="STRING" type="IN"/>
    </query>
    <operation name="insert_customer_operation1">
        <call-query href="insert_customer_query1">
            <with-param name="Name" query-param="Name"/>
            <with-param name="customerID" query-param="customerID"/>
            <with-param name="NID" query-param="NID"/>
        </call-query>
    </operation>
    <query id="select_with_key_customer_query1" useConfig="MySQL1">
        <sql>SELECT NID, Name, customerID FROM user WHERE customerID=?</sql>
        <param name="customerID" ordinal="1" paramType="SCALAR" sqlType="STRING" type="IN"/>
        <result element="customerCollection" rowName="user">
            <element column="NID" name="NID" xsdType="xs:string"/>
            <element column="Name" name="Name" xsdType="xs:string"/>
            <element column="customerID" name="customerID" xsdType="xs:string"/>
        </result>
    </query>
    <operation name="select_with_key_customer_operation1">
        <call-query href="select_with_key_customer_query1">
            <with-param name="customerID" query-param="customerID"/>
        </call-query>
    </operation>
    <query id="select_all_customer_query1" useConfig="MySQL1">
        <sql>SELECT NID, Name, customerID FROM user</sql>
        <result element="customerCollection" rowName="user">
            <element column="NID" name="NID" xsdType="xs:string"/>
            <element column="Name" name="Name" xsdType="xs:string"/>
            <element column="customerID" name="customerID" xsdType="xs:string"/>
        </result>
    </query>
    <operation name="select_all_customer_operation1">
        <call-query href="select_all_customer_query1"/>
    </operation>
    </data>
    
    
    org.h2.jdbcx.JdbcDataSource
    jdbc:h2:文件:./samples/database/DATA\u SERV\u SAMP
    wso2ds
    wso2ds
    org.h2.jdbcx.JdbcDataSource
    jdbc:h2:文件:./samples/database/DATA\u SERV\u SAMP2
    wso2ds
    wso2ds
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/customersdatabase                              
    根
    根123
    com.mysql.jdbc.Driver
    jdbc:mysql://192.168.31.44:3306/guohtdb                              
    根
    根123
    插入账户(余额)值(:余额)
    更新帐户设置余额=余额+:其中accountId=:accountId的值
    从accountId=:accountId的帐户中选择余额
    插入账户(余额)值(:余额)
    更新帐户设置余额=余额+:其中accountId=:accountId的值
    从accountId=:accountId的帐户中选择余额
    在客户(NID、名称、客户ID)值(?、、、?)中插入
    从customerID=?的customer中选择NID、名称、customerID?
    从客户中选择NID、名称、客户ID
    在用户(NID、名称、客户ID)值(?、、、?)中插入
    从customerID=?的用户中选择NID、名称、customerID?
    从用户中选择NID、名称、customerID
    
    您似乎没有正确地将MySQL数据源配置为XA数据源。请在您的案例中使用“MySQL”数据源的此示例配置

       <config id="MySQL">
         <property name="org.wso2.ws.dataservice.xa_datasource_class">com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</property>
          <property name="org.wso2.ws.dataservice.xa_datasource_properties">
             <property name="URL">dbc:mysql://localhost:3306/customersdatabase</property>
             <property name="User">root</property>
             <property name="Password">root123</property>
          </property>
       </config>
    
    
    com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
    dbc:mysql://localhost:3306/customersdatabase
    根
    根123
    
    请从中查找更多信息

    谢谢


    Chanika

    你能在这里发布相关.dbs文件的内容吗?我已经添加了相关.dbs文件的内容。请确认。谢谢你的帮助,它很有效!我还有一个问题。控制台的向导似乎无法完成此配置。但只能通过直接编辑dbs文件的方式。如果开发人员不熟悉dbs文件,则无法完成此配置。如果您愿意将数据源添加为XA数据源,则必须通过提供必要的属性从向导中将其添加为外部数据源。请参阅中的“数据源提供程序”部分。感谢您的帮助。您知道如何配置Oracle和MongoDB的XA数据源吗?Oracle.jdbc.XA.client.oraclexadasource中的Oracle XA驱动程序类