Как выполнить откат транзакции базы данных в wso2 esb или wso2 dss

Я вставляю в три таблицы, используя функцию Box_caring, вставка происходит правильно, но если между ними возникает какая-то ошибка при вставке в таблицы, данные не откатываются.

Я ищу решение следующей задачи: есть набор связанных таблиц. Они связаны отношениями первичного/внешнего ключа и должны обновлять/вставлять объекты в связанные таблицы. Вставка/обновление происходит внутри медиатора итератора. что происходит, когда одно из обновлений/вставок терпит неудачу? Будут ли откатываться все вставленные/обновленные объекты?

Пожалуйста, дайте любые идеи или ссылки или фрагмент кода, чтобы заставить его работать.

Примечание. Я использую wso2 esb-4.8.1, wso2 dss-3.2.2 и базу данных MSSQL.

Прошел по ссылкам ниже: http://charithaka.blogspot.in/2014/02/common-mistakes-to-avoid-in-wso2-esb-1.html

Как мы можем ОТМЕНИТЬ транзакцию в WSO2DSS или WSO2ESB

заранее спасибо


person Siddu    schedule 13.05.2016    source источник


Ответы (2)


Здесь вы должны реализовать транзакции Distributed XA. Не могли бы вы обратиться к статье [1], которая поможет вам в этом.

[1]https://docs.wso2.com/display/ESB490/Sample+657%3A+Distributed+Transaction+Management

person Ravindra Ranwala    schedule 16.05.2016
comment
Я прошел по ссылке, все о посредниках транзакций и dbreport. Но не хочу использовать эти посредники, я ищу внутри box_caring, если произойдет какая-то ошибка, это означает, что транзакции будут откатываться правильно, но в моем случае этого не происходит. - person Siddu; 18.05.2016

Когда вы используете функцию box_carring, вы должны поддерживать один и тот же сеанс для всех вызовов операций. В противном случае он будет оцениваться как отдельные вызовы и не будет атомарным. Вот пример конфигурации синапса, которую можно использовать для поддержания того же сеанса.

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="ESBService"
       transports="https http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <inSequence>
         <transaction action="new"/>
         <property name="id" expression="json-eval($.id)"/>
         <property name="userName" expression="json-eval($.userName)"/>
         <property name="firstName" expression="json-eval($.firstName)"/>
         <property name="lastName" expression="json-eval($.lastName)"/>
         <property name="address" expression="json-eval($.address)"/>
         <enrich>
            <source type="body" clone="true"/>
            <target type="property" property="FirstBody"/>
         </enrich>
         <property name="messageType" value="application/xml" scope="axis2"/>
         <header name="Action" value="urn:begin_boxcar"/>
         <payloadFactory media-type="xml">
            <format>
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                 xmlns:dat="http://ws.wso2.org/dataservice">
                  <soapenv:Header/>
                  <soapenv:Body>
                     <dat:begin_boxcar/>
                  </soapenv:Body>
               </soapenv:Envelope>
            </format>
            <args/>
         </payloadFactory>
         <call>
            <endpoint>
               <address uri="http://localhost:9764/services/testService.SOAP11Endpoint/"/>
            </endpoint>
         </call>
         <property name="setCookieHeader" expression="$trp:Set-Cookie"/>
         <property name="Cookie"
                   expression="get-property('setCookieHeader')"
                   scope="transport"/>
         <property name="OUT_ONLY" value="true"/>
         <payloadFactory media-type="xml">
            <format>
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                 xmlns:dat="http://ws.wso2.org/dataservice">
                  <soapenv:Header/>
                  <soapenv:Body>
                     <p:insert_employee xmlns:p="http://ws.wso2.org/dataservice">
                        <xs:UserId xmlns:xs="http://ws.wso2.org/dataservice">$1</xs:UserId>
                        <xs:userName xmlns:xs="http://ws.wso2.org/dataservice">$2</xs:userName>
                        <xs:firstName xmlns:xs="http://ws.wso2.org/dataservice">$3</xs:firstName>
                        <xs:lastName xmlns:xs="http://ws.wso2.org/dataservice">$4</xs:lastName>
                     </p:insert_employee>
                  </soapenv:Body>
               </soapenv:Envelope>
            </format>
            <args>
               <arg evaluator="xml" expression="get-property('id')"/>
               <arg evaluator="xml" expression="get-property('userName')"/>
               <arg evaluator="xml" expression="get-property('firstName')"/>
               <arg evaluator="xml" expression="get-property('lastName')"/>
            </args>
         </payloadFactory>
         <property name="Content-Encoding" scope="transport" action="remove"/>
         <property name="Cookie"
                   expression="get-property('setCookieHeader')"
                   scope="transport"/>
         <call>
            <endpoint>
               <address uri="http://localhost:9764/services/testService.SOAP11Endpoint/"/>
            </endpoint>
         </call>
         <payloadFactory media-type="xml">
            <format>
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                 xmlns:dat="http://ws.wso2.org/dataservice">
                  <soapenv:Header/>
                  <soapenv:Body>
                     <dat:end_boxcar/>
                  </soapenv:Body>
               </soapenv:Envelope>
            </format>
            <args/>
         </payloadFactory>
         <property name="Content-Encoding" scope="transport" action="remove"/>
         <property name="Cookie"
                   expression="get-property('setCookieHeader')"
                   scope="transport"/>
         <call>
            <endpoint>
               <address uri="http://localhost:9764/services/testService.SOAP11Endpoint/"/>
            </endpoint>
         </call>
         <respond/>
      </inSequence>
      <faultSequence>
         <log>
            <property name="END" value="****ROLLBACK****"/>
         </log>
         <transaction action="rollback"/>
         <respond/>
      </faultSequence>
   </target>
</proxy>

Однако вы можете использовать функцию request_box, где вам не нужно поддерживать сеанс между операциями.

Спасибо

person Chanikag    schedule 20.06.2016