簡體   English   中英

WSO2數據服務服務器分布式事務無法為不同類型的數據庫回滾

[英]WSO2 data services server distributed transactions can not roll back for different types of database

我正在按照本指南測試DSS的分布式事務。

沒關系。 由於addAccountToBank2操作中的錯誤,導致addAccountToBank1服務調用回滾。 在此測試中,這兩個操作都涉及H2 DB。

然后我做另一個測試:

在此測試中,我將H2數據庫之一替換為MySQL數據庫。 這是我的步驟:

  1. 運行begin_boxcar操作。
  2. 將一些數據插入MySQL DB。
  3. 運行addToAccountBalanceInBank2操作,並為“ accountId”字段輸入值“ 1”,為“ value”字段輸入值“ h200”。
  4. 運行end_boxcar操作。
  5. 運行getAccountBalanceFromBank2操作。(余額不變)
  6. 查詢MySQL DB中的數據(已通過插入操作更改)

我不知道為什么MySQL DB不會回滾? 而回滾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>

似乎您沒有適當地將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>

請從這里找到更多。

謝謝

哈尼卡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM