Nested transactions: Outer rollback, inner commit.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Nested transactions: Outer rollback, inner commit.

Matthew Bertolini
I have two service engine methods in Java. Lets call them serviceA and serviceB. ServiceA calls serviceB. Both are transactional but serviceB requires a new transaction. The reason is I want serviceB to succeed even if serviceA needs to rollback (serviceB is a db audit logging method). In this setup, I get the following message when serviceA errors:

The current transaction is marked for rollback, not beginning a new transaction and aborting current operation; the rollbackOnly was caused by: Service [serviceA] …

Based on analysis of the database, I can see that serviceA did rollback as expected but serviceB didn't commit either. Not really sure how to fix this particular issue. Does "require-new-transaction" not really work as advertised? What am I missing?

Thanks,
Matt Bertolini
Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Malin Nicolas
Hi Matt,

If the service A has been rollbacked before call the serviceB ?
If you call serviceB on new transaction, the serviceA wait the serviceB
return so this last has been commited.

Warn with log if you work with a loop :
Service A :
    <iterate ..>
       <call-service name="serviceB"/>
    </>

Nicolas



Le 13/03/2013 20:33, Matthew Bertolini a écrit :
> I have two service engine methods in Java. Lets call them serviceA and serviceB. ServiceA calls serviceB. Both are transactional but serviceB requires a new transaction. The reason is I want serviceB to succeed even if serviceA needs to rollback (serviceB is a db audit logging method). In this setup, I get the following message when serviceA errors:
>
> The current transaction is marked for rollback, not beginning a new transaction and aborting current operation; the rollbackOnly was caused by: Service [serviceA] …
>
> Based on analysis of the database, I can see that serviceA did rollback as expected but serviceB didn't commit either. Not really sure how to fix this particular issue. Does "require-new-transaction" not really work as advertised? What am I missing?
>
> Thanks,
> Matt Bertolini
>


--
Nicolas MALIN
Consultant
Tél : 06.17.66.40.06
Site projet : http://www.neogia.org/
-------
Société LibrenBerry
Tél : 02.48.02.56.12
Site : http://www.librenberry.net/

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Matthew Bertolini
ServiceA has errored and therefore a rollback has been initiated before
serviceB has been called but execution of serviceA has not yet completed.
I am not sure what you mean by iterating. Also, I am working in pure java
so any minilang solutions will not apply.

Thanks,
Matt Bertolini

On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]> wrote:

>Hi Matt,
>
>If the service A has been rollbacked before call the serviceB ?
>If you call serviceB on new transaction, the serviceA wait the serviceB
>return so this last has been commited.
>
>Warn with log if you work with a loop :
>Service A :
>    <iterate ..>
>       <call-service name="serviceB"/>
>    </>
>
>Nicolas
>
>
>
>Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>> I have two service engine methods in Java. Lets call them serviceA and
>>serviceB. ServiceA calls serviceB. Both are transactional but serviceB
>>requires a new transaction. The reason is I want serviceB to succeed
>>even if serviceA needs to rollback (serviceB is a db audit logging
>>method). In this setup, I get the following message when serviceA errors:
>>
>> The current transaction is marked for rollback, not beginning a new
>>transaction and aborting current operation; the rollbackOnly was caused
>>by: Service [serviceA] Š
>>
>> Based on analysis of the database, I can see that serviceA did rollback
>>as expected but serviceB didn't commit either. Not really sure how to
>>fix this particular issue. Does "require-new-transaction" not really
>>work as advertised? What am I missing?
>>
>> Thanks,
>> Matt Bertolini
>>
>
>
>--
>Nicolas MALIN
>Consultant
>Tél : 06.17.66.40.06
>Site projet : http://www.neogia.org/
>-------
>Société LibrenBerry
>Tél : 02.48.02.56.12
>Site : http://www.librenberry.net/
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Malin Nicolas
Matt can you give me the serviceA code ?

Nicolas

Le 14/03/2013 15:53, Matthew Bertolini a écrit :

> ServiceA has errored and therefore a rollback has been initiated before
> serviceB has been called but execution of serviceA has not yet completed.
> I am not sure what you mean by iterating. Also, I am working in pure java
> so any minilang solutions will not apply.
>
> Thanks,
> Matt Bertolini
>
> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]> wrote:
>
>> Hi Matt,
>>
>> If the service A has been rollbacked before call the serviceB ?
>> If you call serviceB on new transaction, the serviceA wait the serviceB
>> return so this last has been commited.
>>
>> Warn with log if you work with a loop :
>> Service A :
>>     <iterate ..>
>>        <call-service name="serviceB"/>
>>     </>
>>
>> Nicolas
>>
>>
>>
>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>> I have two service engine methods in Java. Lets call them serviceA and
>>> serviceB. ServiceA calls serviceB. Both are transactional but serviceB
>>> requires a new transaction. The reason is I want serviceB to succeed
>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>> method). In this setup, I get the following message when serviceA errors:
>>>
>>> The current transaction is marked for rollback, not beginning a new
>>> transaction and aborting current operation; the rollbackOnly was caused
>>> by: Service [serviceA] Š
>>>
>>> Based on analysis of the database, I can see that serviceA did rollback
>>> as expected but serviceB didn't commit either. Not really sure how to
>>> fix this particular issue. Does "require-new-transaction" not really
>>> work as advertised? What am I missing?
>>>
>>> Thanks,
>>> Matt Bertolini
>>>
>>
>> --
>> Nicolas MALIN
>> Consultant
>> Tél : 06.17.66.40.06
>> Site projet : http://www.neogia.org/
>> -------
>> Société LibrenBerry
>> Tél : 02.48.02.56.12
>> Site : http://www.librenberry.net/
>>


--
Nicolas MALIN
Consultant
Tél : 06.17.66.40.06
Site projet : http://www.neogia.org/
-------
Société LibrenBerry
Tél : 02.48.02.56.12
Site : http://www.librenberry.net/

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Matthew Bertolini
Sorry for the delayed response. I was swamped with other things. I have
created a simplified example to demonstrate my code:

// Outer transaction begins in serviceA
public static Map serviceA(DispatchContext dispatchContext, Map inputData)
{
    GenericDelegator delegator = dispatchContext.getDelegator();
    LocalDispatcher dispatcher = dispatchContext.getDispatcher();

    // ...

    try {
        Map results = dispatcher.runSync("doSomething", data); // Causes
error and initiates a rollback.
    } catch (GenericServiceException e) {
        // Service B requires a new transaction and should always commit
regardless of outer transaction.
        Map serviceBResults = dispatcher.runSync("serviceB", data);
        return ServiceUtil.returnError("message", e.getMessageList());
    }

    // ...

    return ServiceUtil.returnSuccess(successMessage);
}


I hope this helps illustrate the issue.

Thanks
Matt Bertolini

On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]> wrote:

>Matt can you give me the serviceA code ?
>
>Nicolas
>
>Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>> ServiceA has errored and therefore a rollback has been initiated before
>> serviceB has been called but execution of serviceA has not yet
>>completed.
>> I am not sure what you mean by iterating. Also, I am working in pure
>>java
>> so any minilang solutions will not apply.
>>
>> Thanks,
>> Matt Bertolini
>>
>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>wrote:
>>
>>> Hi Matt,
>>>
>>> If the service A has been rollbacked before call the serviceB ?
>>> If you call serviceB on new transaction, the serviceA wait the serviceB
>>> return so this last has been commited.
>>>
>>> Warn with log if you work with a loop :
>>> Service A :
>>>     <iterate ..>
>>>        <call-service name="serviceB"/>
>>>     </>
>>>
>>> Nicolas
>>>
>>>
>>>
>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>> I have two service engine methods in Java. Lets call them serviceA and
>>>> serviceB. ServiceA calls serviceB. Both are transactional but serviceB
>>>> requires a new transaction. The reason is I want serviceB to succeed
>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>> method). In this setup, I get the following message when serviceA
>>>>errors:
>>>>
>>>> The current transaction is marked for rollback, not beginning a new
>>>> transaction and aborting current operation; the rollbackOnly was
>>>>caused
>>>> by: Service [serviceA] Š
>>>>
>>>> Based on analysis of the database, I can see that serviceA did
>>>>rollback
>>>> as expected but serviceB didn't commit either. Not really sure how to
>>>> fix this particular issue. Does "require-new-transaction" not really
>>>> work as advertised? What am I missing?
>>>>
>>>> Thanks,
>>>> Matt Bertolini
>>>>
>>>
>>> --
>>> Nicolas MALIN
>>> Consultant
>>> Tél : 06.17.66.40.06
>>> Site projet : http://www.neogia.org/
>>> -------
>>> Société LibrenBerry
>>> Tél : 02.48.02.56.12
>>> Site : http://www.librenberry.net/
>>>
>
>
>--
>Nicolas MALIN
>Consultant
>Tél : 06.17.66.40.06
>Site projet : http://www.neogia.org/
>-------
>Société LibrenBerry
>Tél : 02.48.02.56.12
>Site : http://www.librenberry.net/
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Deepak Dixit-2
Matt,

As per you code if "doSomething"  service return error then transaction will be roll backed, as if service return error then transaction marked as rollback hence it will rollback the transaction of parent service as well.

If doSomething fails to perform business logic then you can return failure from service and then user ServiceUtil.isFailure() to check failure and if this return true then you can run serviceB and return error with errorMsg.

So your code looks like this:

{code}
   try {
       Map results = dispatcher.runSync("doSomething", data); // return failure
      if (ServiceUtil.isError(results)) {
                 // Service B requires a new transaction and should always commit regardless of outer transaction.
                Map  serviceBResults = dispatcher.runSync("serviceB", data);
        return ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
        }
   } catch (GenericServiceException e) {
       return ServiceUtil.returnError("message", e.getMessageList());
   }
{code}

Or you can you use another syntax of runSync method for serviceB:

{code}
try  {
        Map results = dispatcher.runSync("doSomething", data); // Causes error and initiates a rollback.
        } catch (GenericServiceException e) {
      // Service B requires a new transaction and should always commit regardless of outer transaction.
                Map serviceBResults = dispatcher.runSync("serviceB", data, 300, true);// Use require new transaction true
        return ServiceUtil.returnError("message", e.getMessageList());
    }
{code}


Thanks & Regards
--
Deepak Dixit
HotWax Media Pvt. Ltd.
www.hotwaxmedia.com
Contact :- +91-98267-54548
Skype  :- deepakdixit

On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:

> Sorry for the delayed response. I was swamped with other things. I have
> created a simplified example to demonstrate my code:
>
> // Outer transaction begins in serviceA
> public static Map serviceA(DispatchContext dispatchContext, Map inputData)
> {
>    GenericDelegator delegator = dispatchContext.getDelegator();
>    LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>
>    // ...
>
>    try {
>        Map results = dispatcher.runSync("doSomething", data); // Causes
> error and initiates a rollback.
>    } catch (GenericServiceException e) {
>        // Service B requires a new transaction and should always commit
> regardless of outer transaction.
>        Map serviceBResults = dispatcher.runSync("serviceB", data);
>        return ServiceUtil.returnError("message", e.getMessageList());
>    }
>
>    // ...
>
>    return ServiceUtil.returnSuccess(successMessage);
> }
>
>
> I hope this helps illustrate the issue.
>
> Thanks
> Matt Bertolini
>
> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]> wrote:
>
>> Matt can you give me the serviceA code ?
>>
>> Nicolas
>>
>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>> ServiceA has errored and therefore a rollback has been initiated before
>>> serviceB has been called but execution of serviceA has not yet
>>> completed.
>>> I am not sure what you mean by iterating. Also, I am working in pure
>>> java
>>> so any minilang solutions will not apply.
>>>
>>> Thanks,
>>> Matt Bertolini
>>>
>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>> wrote:
>>>
>>>> Hi Matt,
>>>>
>>>> If the service A has been rollbacked before call the serviceB ?
>>>> If you call serviceB on new transaction, the serviceA wait the serviceB
>>>> return so this last has been commited.
>>>>
>>>> Warn with log if you work with a loop :
>>>> Service A :
>>>>    <iterate ..>
>>>>       <call-service name="serviceB"/>
>>>>    </>
>>>>
>>>> Nicolas
>>>>
>>>>
>>>>
>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>> I have two service engine methods in Java. Lets call them serviceA and
>>>>> serviceB. ServiceA calls serviceB. Both are transactional but serviceB
>>>>> requires a new transaction. The reason is I want serviceB to succeed
>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>> method). In this setup, I get the following message when serviceA
>>>>> errors:
>>>>>
>>>>> The current transaction is marked for rollback, not beginning a new
>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>> caused
>>>>> by: Service [serviceA] Š
>>>>>
>>>>> Based on analysis of the database, I can see that serviceA did
>>>>> rollback
>>>>> as expected but serviceB didn't commit either. Not really sure how to
>>>>> fix this particular issue. Does "require-new-transaction" not really
>>>>> work as advertised? What am I missing?
>>>>>
>>>>> Thanks,
>>>>> Matt Bertolini
>>>>>
>>>>
>>>> --
>>>> Nicolas MALIN
>>>> Consultant
>>>> Tél : 06.17.66.40.06
>>>> Site projet : http://www.neogia.org/
>>>> -------
>>>> Société LibrenBerry
>>>> Tél : 02.48.02.56.12
>>>> Site : http://www.librenberry.net/
>>>>
>>
>>
>> --
>> Nicolas MALIN
>> Consultant
>> Tél : 06.17.66.40.06
>> Site projet : http://www.neogia.org/
>> -------
>> Société LibrenBerry
>> Tél : 02.48.02.56.12
>> Site : http://www.librenberry.net/
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Matthew Bertolini
Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure()
methods are in use by my services. I neglected to copy them over to my
example. But what about unexpected exceptions like RuntimeException or
something that is thrown by the service engine itself. I don't have a
choice to return failure like I do in my own code but I still want my
serviceB to commit?

Thanks,
Matt Bertolini

On 3/22/13 1:46 PM, "Deepak Dixit" <[hidden email]> wrote:

>Matt,
>
>As per you code if "doSomething"  service return error then transaction
>will be roll backed, as if service return error then transaction marked
>as rollback hence it will rollback the transaction of parent service as
>well.
>
>If doSomething fails to perform business logic then you can return
>failure from service and then user ServiceUtil.isFailure() to check
>failure and if this return true then you can run serviceB and return
>error with errorMsg.
>
>So your code looks like this:
>
>{code}
>   try {
>       Map results = dispatcher.runSync("doSomething", data); // return
>failure
>       if (ServiceUtil.isError(results)) {
> // Service B requires a new transaction and should always commit
>regardless of outer transaction.
>        Map  serviceBResults = dispatcher.runSync("serviceB", data);
>         return
>ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
> }
>   } catch (GenericServiceException e) {
>       return ServiceUtil.returnError("message", e.getMessageList());
>   }
>{code}
>
>Or you can you use another syntax of runSync method for serviceB:
>
>{code}
>try  {
>       Map results = dispatcher.runSync("doSomething", data); // Causes
>error and initiates a rollback.
> } catch (GenericServiceException e) {
>       // Service B requires a new transaction and should always commit
>regardless of outer transaction.
>       Map serviceBResults = dispatcher.runSync("serviceB", data, 300,
>true);// Use require new transaction true
>       return ServiceUtil.returnError("message", e.getMessageList());
>   }
>{code}
>
>
>Thanks & Regards
>--
>Deepak Dixit
>HotWax Media Pvt. Ltd.
>www.hotwaxmedia.com
>Contact :- +91-98267-54548
>Skype  :- deepakdixit
>
>On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:
>
>> Sorry for the delayed response. I was swamped with other things. I have
>> created a simplified example to demonstrate my code:
>>
>> // Outer transaction begins in serviceA
>> public static Map serviceA(DispatchContext dispatchContext, Map
>>inputData)
>> {
>>    GenericDelegator delegator = dispatchContext.getDelegator();
>>    LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>>
>>    // ...
>>
>>    try {
>>        Map results = dispatcher.runSync("doSomething", data); // Causes
>> error and initiates a rollback.
>>    } catch (GenericServiceException e) {
>>        // Service B requires a new transaction and should always commit
>> regardless of outer transaction.
>>        Map serviceBResults = dispatcher.runSync("serviceB", data);
>>        return ServiceUtil.returnError("message", e.getMessageList());
>>    }
>>
>>    // ...
>>
>>    return ServiceUtil.returnSuccess(successMessage);
>> }
>>
>>
>> I hope this helps illustrate the issue.
>>
>> Thanks
>> Matt Bertolini
>>
>> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]>
>>wrote:
>>
>>> Matt can you give me the serviceA code ?
>>>
>>> Nicolas
>>>
>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>>> ServiceA has errored and therefore a rollback has been initiated
>>>>before
>>>> serviceB has been called but execution of serviceA has not yet
>>>> completed.
>>>> I am not sure what you mean by iterating. Also, I am working in pure
>>>> java
>>>> so any minilang solutions will not apply.
>>>>
>>>> Thanks,
>>>> Matt Bertolini
>>>>
>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>>> wrote:
>>>>
>>>>> Hi Matt,
>>>>>
>>>>> If the service A has been rollbacked before call the serviceB ?
>>>>> If you call serviceB on new transaction, the serviceA wait the
>>>>>serviceB
>>>>> return so this last has been commited.
>>>>>
>>>>> Warn with log if you work with a loop :
>>>>> Service A :
>>>>>    <iterate ..>
>>>>>       <call-service name="serviceB"/>
>>>>>    </>
>>>>>
>>>>> Nicolas
>>>>>
>>>>>
>>>>>
>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>>> I have two service engine methods in Java. Lets call them serviceA
>>>>>>and
>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but
>>>>>>serviceB
>>>>>> requires a new transaction. The reason is I want serviceB to succeed
>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>>> method). In this setup, I get the following message when serviceA
>>>>>> errors:
>>>>>>
>>>>>> The current transaction is marked for rollback, not beginning a new
>>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>>> caused
>>>>>> by: Service [serviceA] Š
>>>>>>
>>>>>> Based on analysis of the database, I can see that serviceA did
>>>>>> rollback
>>>>>> as expected but serviceB didn't commit either. Not really sure how
>>>>>>to
>>>>>> fix this particular issue. Does "require-new-transaction" not really
>>>>>> work as advertised? What am I missing?
>>>>>>
>>>>>> Thanks,
>>>>>> Matt Bertolini
>>>>>>
>>>>>
>>>>> --
>>>>> Nicolas MALIN
>>>>> Consultant
>>>>> Tél : 06.17.66.40.06
>>>>> Site projet : http://www.neogia.org/
>>>>> -------
>>>>> Société LibrenBerry
>>>>> Tél : 02.48.02.56.12
>>>>> Site : http://www.librenberry.net/
>>>>>
>>>
>>>
>>> --
>>> Nicolas MALIN
>>> Consultant
>>> Tél : 06.17.66.40.06
>>> Site projet : http://www.neogia.org/
>>> -------
>>> Société LibrenBerry
>>> Tél : 02.48.02.56.12
>>> Site : http://www.librenberry.net/
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Deepak Dixit-2
Matt,

In this case you can use requireNewTransaction for serviceB calling.

Map serviceBResults =  serviceBResults = dispatcher.runSync("serviceB", data, <TransactionTimeOut> , true);// Use require new transaction true//


Thanks & Regards
--
Deepak Dixit
HotWax Media Pvt. Ltd.
www.hotwaxmedia.com
Contact :- +91-98267-54548
Skype  :- deepakdixit

On Mar 22, 2013, at 11:45 PM, Matthew Bertolini wrote:

> Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure()
> methods are in use by my services. I neglected to copy them over to my
> example. But what about unexpected exceptions like RuntimeException or
> something that is thrown by the service engine itself. I don't have a
> choice to return failure like I do in my own code but I still want my
> serviceB to commit?
>
> Thanks,
> Matt Bertolini
>
> On 3/22/13 1:46 PM, "Deepak Dixit" <[hidden email]> wrote:
>
>> Matt,
>>
>> As per you code if "doSomething"  service return error then transaction
>> will be roll backed, as if service return error then transaction marked
>> as rollback hence it will rollback the transaction of parent service as
>> well.
>>
>> If doSomething fails to perform business logic then you can return
>> failure from service and then user ServiceUtil.isFailure() to check
>> failure and if this return true then you can run serviceB and return
>> error with errorMsg.
>>
>> So your code looks like this:
>>
>> {code}
>>  try {
>>      Map results = dispatcher.runSync("doSomething", data); // return
>> failure
>>     if (ServiceUtil.isError(results)) {
>> // Service B requires a new transaction and should always commit
>> regardless of outer transaction.
>>        Map  serviceBResults = dispatcher.runSync("serviceB", data);
>>       return
>> ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
>> }
>>  } catch (GenericServiceException e) {
>>      return ServiceUtil.returnError("message", e.getMessageList());
>>  }
>> {code}
>>
>> Or you can you use another syntax of runSync method for serviceB:
>>
>> {code}
>> try  {
>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>> error and initiates a rollback.
>> } catch (GenericServiceException e) {
>>     // Service B requires a new transaction and should always commit
>> regardless of outer transaction.
>>       Map serviceBResults = dispatcher.runSync("serviceB", data, 300,
>> true);// Use require new transaction true
>>       return ServiceUtil.returnError("message", e.getMessageList());
>>   }
>> {code}
>>
>>
>> Thanks & Regards
>> --
>> Deepak Dixit
>> HotWax Media Pvt. Ltd.
>> www.hotwaxmedia.com
>> Contact :- +91-98267-54548
>> Skype  :- deepakdixit
>>
>> On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:
>>
>>> Sorry for the delayed response. I was swamped with other things. I have
>>> created a simplified example to demonstrate my code:
>>>
>>> // Outer transaction begins in serviceA
>>> public static Map serviceA(DispatchContext dispatchContext, Map
>>> inputData)
>>> {
>>>   GenericDelegator delegator = dispatchContext.getDelegator();
>>>   LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>>>
>>>   // ...
>>>
>>>   try {
>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>> error and initiates a rollback.
>>>   } catch (GenericServiceException e) {
>>>       // Service B requires a new transaction and should always commit
>>> regardless of outer transaction.
>>>       Map serviceBResults = dispatcher.runSync("serviceB", data);
>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>   }
>>>
>>>   // ...
>>>
>>>   return ServiceUtil.returnSuccess(successMessage);
>>> }
>>>
>>>
>>> I hope this helps illustrate the issue.
>>>
>>> Thanks
>>> Matt Bertolini
>>>
>>> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]>
>>> wrote:
>>>
>>>> Matt can you give me the serviceA code ?
>>>>
>>>> Nicolas
>>>>
>>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>>>> ServiceA has errored and therefore a rollback has been initiated
>>>>> before
>>>>> serviceB has been called but execution of serviceA has not yet
>>>>> completed.
>>>>> I am not sure what you mean by iterating. Also, I am working in pure
>>>>> java
>>>>> so any minilang solutions will not apply.
>>>>>
>>>>> Thanks,
>>>>> Matt Bertolini
>>>>>
>>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>>>> wrote:
>>>>>
>>>>>> Hi Matt,
>>>>>>
>>>>>> If the service A has been rollbacked before call the serviceB ?
>>>>>> If you call serviceB on new transaction, the serviceA wait the
>>>>>> serviceB
>>>>>> return so this last has been commited.
>>>>>>
>>>>>> Warn with log if you work with a loop :
>>>>>> Service A :
>>>>>>   <iterate ..>
>>>>>>      <call-service name="serviceB"/>
>>>>>>   </>
>>>>>>
>>>>>> Nicolas
>>>>>>
>>>>>>
>>>>>>
>>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>>>> I have two service engine methods in Java. Lets call them serviceA
>>>>>>> and
>>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but
>>>>>>> serviceB
>>>>>>> requires a new transaction. The reason is I want serviceB to succeed
>>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>>>> method). In this setup, I get the following message when serviceA
>>>>>>> errors:
>>>>>>>
>>>>>>> The current transaction is marked for rollback, not beginning a new
>>>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>>>> caused
>>>>>>> by: Service [serviceA] Š
>>>>>>>
>>>>>>> Based on analysis of the database, I can see that serviceA did
>>>>>>> rollback
>>>>>>> as expected but serviceB didn't commit either. Not really sure how
>>>>>>> to
>>>>>>> fix this particular issue. Does "require-new-transaction" not really
>>>>>>> work as advertised? What am I missing?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Matt Bertolini
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Nicolas MALIN
>>>>>> Consultant
>>>>>> Tél : 06.17.66.40.06
>>>>>> Site projet : http://www.neogia.org/
>>>>>> -------
>>>>>> Société LibrenBerry
>>>>>> Tél : 02.48.02.56.12
>>>>>> Site : http://www.librenberry.net/
>>>>>>
>>>>
>>>>
>>>> --
>>>> Nicolas MALIN
>>>> Consultant
>>>> Tél : 06.17.66.40.06
>>>> Site projet : http://www.neogia.org/
>>>> -------
>>>> Société LibrenBerry
>>>> Tél : 02.48.02.56.12
>>>> Site : http://www.librenberry.net/
>>>>
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Matthew Bertolini
Thanks Deepak. I will give that a shot.

Matt Bertolini

On 3/22/13 2:28 PM, "Deepak Dixit" <[hidden email]> wrote:

>Matt,
>
>In this case you can use requireNewTransaction for serviceB calling.
>
>Map serviceBResults =  serviceBResults = dispatcher.runSync("serviceB",
>data, <TransactionTimeOut> , true);// Use require new transaction true//
>
>
>Thanks & Regards
>--
>Deepak Dixit
>HotWax Media Pvt. Ltd.
>www.hotwaxmedia.com
>Contact :- +91-98267-54548
>Skype  :- deepakdixit
>
>On Mar 22, 2013, at 11:45 PM, Matthew Bertolini wrote:
>
>> Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure()
>> methods are in use by my services. I neglected to copy them over to my
>> example. But what about unexpected exceptions like RuntimeException or
>> something that is thrown by the service engine itself. I don't have a
>> choice to return failure like I do in my own code but I still want my
>> serviceB to commit?
>>
>> Thanks,
>> Matt Bertolini
>>
>> On 3/22/13 1:46 PM, "Deepak Dixit" <[hidden email]> wrote:
>>
>>> Matt,
>>>
>>> As per you code if "doSomething"  service return error then transaction
>>> will be roll backed, as if service return error then transaction marked
>>> as rollback hence it will rollback the transaction of parent service as
>>> well.
>>>
>>> If doSomething fails to perform business logic then you can return
>>> failure from service and then user ServiceUtil.isFailure() to check
>>> failure and if this return true then you can run serviceB and return
>>> error with errorMsg.
>>>
>>> So your code looks like this:
>>>
>>> {code}
>>>  try {
>>>      Map results = dispatcher.runSync("doSomething", data); // return
>>> failure
>>>     if (ServiceUtil.isError(results)) {
>>> // Service B requires a new transaction and should always commit
>>> regardless of outer transaction.
>>>        Map  serviceBResults = dispatcher.runSync("serviceB", data);
>>>       return
>>> ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
>>> }
>>>  } catch (GenericServiceException e) {
>>>      return ServiceUtil.returnError("message", e.getMessageList());
>>>  }
>>> {code}
>>>
>>> Or you can you use another syntax of runSync method for serviceB:
>>>
>>> {code}
>>> try  {
>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>> error and initiates a rollback.
>>> } catch (GenericServiceException e) {
>>>     // Service B requires a new transaction and should always commit
>>> regardless of outer transaction.
>>>       Map serviceBResults = dispatcher.runSync("serviceB", data,
>>>300,
>>> true);// Use require new transaction true
>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>   }
>>> {code}
>>>
>>>
>>> Thanks & Regards
>>> --
>>> Deepak Dixit
>>> HotWax Media Pvt. Ltd.
>>> www.hotwaxmedia.com
>>> Contact :- +91-98267-54548
>>> Skype  :- deepakdixit
>>>
>>> On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:
>>>
>>>> Sorry for the delayed response. I was swamped with other things. I
>>>>have
>>>> created a simplified example to demonstrate my code:
>>>>
>>>> // Outer transaction begins in serviceA
>>>> public static Map serviceA(DispatchContext dispatchContext, Map
>>>> inputData)
>>>> {
>>>>   GenericDelegator delegator = dispatchContext.getDelegator();
>>>>   LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>>>>
>>>>   // ...
>>>>
>>>>   try {
>>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>>> error and initiates a rollback.
>>>>   } catch (GenericServiceException e) {
>>>>       // Service B requires a new transaction and should always commit
>>>> regardless of outer transaction.
>>>>       Map serviceBResults = dispatcher.runSync("serviceB", data);
>>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>>   }
>>>>
>>>>   // ...
>>>>
>>>>   return ServiceUtil.returnSuccess(successMessage);
>>>> }
>>>>
>>>>
>>>> I hope this helps illustrate the issue.
>>>>
>>>> Thanks
>>>> Matt Bertolini
>>>>
>>>> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]>
>>>> wrote:
>>>>
>>>>> Matt can you give me the serviceA code ?
>>>>>
>>>>> Nicolas
>>>>>
>>>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>>>>> ServiceA has errored and therefore a rollback has been initiated
>>>>>> before
>>>>>> serviceB has been called but execution of serviceA has not yet
>>>>>> completed.
>>>>>> I am not sure what you mean by iterating. Also, I am working in pure
>>>>>> java
>>>>>> so any minilang solutions will not apply.
>>>>>>
>>>>>> Thanks,
>>>>>> Matt Bertolini
>>>>>>
>>>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Matt,
>>>>>>>
>>>>>>> If the service A has been rollbacked before call the serviceB ?
>>>>>>> If you call serviceB on new transaction, the serviceA wait the
>>>>>>> serviceB
>>>>>>> return so this last has been commited.
>>>>>>>
>>>>>>> Warn with log if you work with a loop :
>>>>>>> Service A :
>>>>>>>   <iterate ..>
>>>>>>>      <call-service name="serviceB"/>
>>>>>>>   </>
>>>>>>>
>>>>>>> Nicolas
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>>>>> I have two service engine methods in Java. Lets call them serviceA
>>>>>>>> and
>>>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but
>>>>>>>> serviceB
>>>>>>>> requires a new transaction. The reason is I want serviceB to
>>>>>>>>succeed
>>>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>>>>> method). In this setup, I get the following message when serviceA
>>>>>>>> errors:
>>>>>>>>
>>>>>>>> The current transaction is marked for rollback, not beginning a
>>>>>>>>new
>>>>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>>>>> caused
>>>>>>>> by: Service [serviceA] Š
>>>>>>>>
>>>>>>>> Based on analysis of the database, I can see that serviceA did
>>>>>>>> rollback
>>>>>>>> as expected but serviceB didn't commit either. Not really sure how
>>>>>>>> to
>>>>>>>> fix this particular issue. Does "require-new-transaction" not
>>>>>>>>really
>>>>>>>> work as advertised? What am I missing?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Matt Bertolini
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Nicolas MALIN
>>>>>>> Consultant
>>>>>>> Tél : 06.17.66.40.06
>>>>>>> Site projet : http://www.neogia.org/
>>>>>>> -------
>>>>>>> Société LibrenBerry
>>>>>>> Tél : 02.48.02.56.12
>>>>>>> Site : http://www.librenberry.net/
>>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Nicolas MALIN
>>>>> Consultant
>>>>> Tél : 06.17.66.40.06
>>>>> Site projet : http://www.neogia.org/
>>>>> -------
>>>>> Société LibrenBerry
>>>>> Tél : 02.48.02.56.12
>>>>> Site : http://www.librenberry.net/
>>>>>
>>>>
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Malin Nicolas
I have a doubt to create a new transaction after the lasted have been
set to failed.

If the Deppak's solution doesn't work, try to run serviceB by runASync.

Nicolas

Le 22/03/2013 19:36, Matthew Bertolini a écrit :

> Thanks Deepak. I will give that a shot.
>
> Matt Bertolini
>
> On 3/22/13 2:28 PM, "Deepak Dixit" <[hidden email]> wrote:
>
>> Matt,
>>
>> In this case you can use requireNewTransaction for serviceB calling.
>>
>> Map serviceBResults =  serviceBResults = dispatcher.runSync("serviceB",
>> data, <TransactionTimeOut> , true);// Use require new transaction true//
>>
>>
>> Thanks & Regards
>> --
>> Deepak Dixit
>> HotWax Media Pvt. Ltd.
>> www.hotwaxmedia.com
>> Contact :- +91-98267-54548
>> Skype  :- deepakdixit
>>
>> On Mar 22, 2013, at 11:45 PM, Matthew Bertolini wrote:
>>
>>> Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure()
>>> methods are in use by my services. I neglected to copy them over to my
>>> example. But what about unexpected exceptions like RuntimeException or
>>> something that is thrown by the service engine itself. I don't have a
>>> choice to return failure like I do in my own code but I still want my
>>> serviceB to commit?
>>>
>>> Thanks,
>>> Matt Bertolini
>>>
>>> On 3/22/13 1:46 PM, "Deepak Dixit" <[hidden email]> wrote:
>>>
>>>> Matt,
>>>>
>>>> As per you code if "doSomething"  service return error then transaction
>>>> will be roll backed, as if service return error then transaction marked
>>>> as rollback hence it will rollback the transaction of parent service as
>>>> well.
>>>>
>>>> If doSomething fails to perform business logic then you can return
>>>> failure from service and then user ServiceUtil.isFailure() to check
>>>> failure and if this return true then you can run serviceB and return
>>>> error with errorMsg.
>>>>
>>>> So your code looks like this:
>>>>
>>>> {code}
>>>>   try {
>>>>       Map results = dispatcher.runSync("doSomething", data); // return
>>>> failure
>>>>       if (ServiceUtil.isError(results)) {
>>>> // Service B requires a new transaction and should always commit
>>>> regardless of outer transaction.
>>>>        Map  serviceBResults = dispatcher.runSync("serviceB", data);
>>>>         return
>>>> ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
>>>> }
>>>>   } catch (GenericServiceException e) {
>>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>>   }
>>>> {code}
>>>>
>>>> Or you can you use another syntax of runSync method for serviceB:
>>>>
>>>> {code}
>>>> try  {
>>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>>> error and initiates a rollback.
>>>> } catch (GenericServiceException e) {
>>>>       // Service B requires a new transaction and should always commit
>>>> regardless of outer transaction.
>>>>       Map serviceBResults = dispatcher.runSync("serviceB", data,
>>>> 300,
>>>> true);// Use require new transaction true
>>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>>   }
>>>> {code}
>>>>
>>>>
>>>> Thanks & Regards
>>>> --
>>>> Deepak Dixit
>>>> HotWax Media Pvt. Ltd.
>>>> www.hotwaxmedia.com
>>>> Contact :- +91-98267-54548
>>>> Skype  :- deepakdixit
>>>>
>>>> On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:
>>>>
>>>>> Sorry for the delayed response. I was swamped with other things. I
>>>>> have
>>>>> created a simplified example to demonstrate my code:
>>>>>
>>>>> // Outer transaction begins in serviceA
>>>>> public static Map serviceA(DispatchContext dispatchContext, Map
>>>>> inputData)
>>>>> {
>>>>>    GenericDelegator delegator = dispatchContext.getDelegator();
>>>>>    LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>>>>>
>>>>>    // ...
>>>>>
>>>>>    try {
>>>>>        Map results = dispatcher.runSync("doSomething", data); // Causes
>>>>> error and initiates a rollback.
>>>>>    } catch (GenericServiceException e) {
>>>>>        // Service B requires a new transaction and should always commit
>>>>> regardless of outer transaction.
>>>>>        Map serviceBResults = dispatcher.runSync("serviceB", data);
>>>>>        return ServiceUtil.returnError("message", e.getMessageList());
>>>>>    }
>>>>>
>>>>>    // ...
>>>>>
>>>>>    return ServiceUtil.returnSuccess(successMessage);
>>>>> }
>>>>>
>>>>>
>>>>> I hope this helps illustrate the issue.
>>>>>
>>>>> Thanks
>>>>> Matt Bertolini
>>>>>
>>>>> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]>
>>>>> wrote:
>>>>>
>>>>>> Matt can you give me the serviceA code ?
>>>>>>
>>>>>> Nicolas
>>>>>>
>>>>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>>>>>> ServiceA has errored and therefore a rollback has been initiated
>>>>>>> before
>>>>>>> serviceB has been called but execution of serviceA has not yet
>>>>>>> completed.
>>>>>>> I am not sure what you mean by iterating. Also, I am working in pure
>>>>>>> java
>>>>>>> so any minilang solutions will not apply.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Matt Bertolini
>>>>>>>
>>>>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi Matt,
>>>>>>>>
>>>>>>>> If the service A has been rollbacked before call the serviceB ?
>>>>>>>> If you call serviceB on new transaction, the serviceA wait the
>>>>>>>> serviceB
>>>>>>>> return so this last has been commited.
>>>>>>>>
>>>>>>>> Warn with log if you work with a loop :
>>>>>>>> Service A :
>>>>>>>>    <iterate ..>
>>>>>>>>       <call-service name="serviceB"/>
>>>>>>>>    </>
>>>>>>>>
>>>>>>>> Nicolas
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>>>>>> I have two service engine methods in Java. Lets call them serviceA
>>>>>>>>> and
>>>>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but
>>>>>>>>> serviceB
>>>>>>>>> requires a new transaction. The reason is I want serviceB to
>>>>>>>>> succeed
>>>>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>>>>>> method). In this setup, I get the following message when serviceA
>>>>>>>>> errors:
>>>>>>>>>
>>>>>>>>> The current transaction is marked for rollback, not beginning a
>>>>>>>>> new
>>>>>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>>>>>> caused
>>>>>>>>> by: Service [serviceA] Š
>>>>>>>>>
>>>>>>>>> Based on analysis of the database, I can see that serviceA did
>>>>>>>>> rollback
>>>>>>>>> as expected but serviceB didn't commit either. Not really sure how
>>>>>>>>> to
>>>>>>>>> fix this particular issue. Does "require-new-transaction" not
>>>>>>>>> really
>>>>>>>>> work as advertised? What am I missing?
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Matt Bertolini
>>>>>>>>>
>>>>>>>> --
>>>>>>>> Nicolas MALIN
>>>>>>>> Consultant
>>>>>>>> Tél : 06.17.66.40.06
>>>>>>>> Site projet : http://www.neogia.org/
>>>>>>>> -------
>>>>>>>> Société LibrenBerry
>>>>>>>> Tél : 02.48.02.56.12
>>>>>>>> Site : http://www.librenberry.net/
>>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Nicolas MALIN
>>>>>> Consultant
>>>>>> Tél : 06.17.66.40.06
>>>>>> Site projet : http://www.neogia.org/
>>>>>> -------
>>>>>> Société LibrenBerry
>>>>>> Tél : 02.48.02.56.12
>>>>>> Site : http://www.librenberry.net/
>>>>>>


--
Nicolas MALIN
Consultant
Tél : 06.17.66.40.06
Site projet : http://www.neogia.org/
-------
Société LibrenBerry
Tél : 02.48.02.56.12
Site : http://www.librenberry.net/

Reply | Threaded
Open this post in threaded view
|

Re: Nested transactions: Outer rollback, inner commit.

Deepak Dixit-2
Hi Nikols,

rynASync method  do the same and create new transaction for service :)


Thanks & Regards
--
Deepak Dixit
HotWax Media Pvt. Ltd.
www.hotwaxmedia.com
Contact :- +91-98267-54548
Skype  :- deepakdixit

On Mar 23, 2013, at 3:05 AM, Nicolas Malin wrote:

> I have a doubt to create a new transaction after the lasted have been set to failed.
>
> If the Deppak's solution doesn't work, try to run serviceB by runASync.
>
> Nicolas
>
> Le 22/03/2013 19:36, Matthew Bertolini a écrit :
>> Thanks Deepak. I will give that a shot.
>>
>> Matt Bertolini
>>
>> On 3/22/13 2:28 PM, "Deepak Dixit" <[hidden email]> wrote:
>>
>>> Matt,
>>>
>>> In this case you can use requireNewTransaction for serviceB calling.
>>>
>>> Map serviceBResults =  serviceBResults = dispatcher.runSync("serviceB",
>>> data, <TransactionTimeOut> , true);// Use require new transaction true//
>>>
>>>
>>> Thanks & Regards
>>> --
>>> Deepak Dixit
>>> HotWax Media Pvt. Ltd.
>>> www.hotwaxmedia.com
>>> Contact :- +91-98267-54548
>>> Skype  :- deepakdixit
>>>
>>> On Mar 22, 2013, at 11:45 PM, Matthew Bertolini wrote:
>>>
>>>> Thanks for the reply Deepak. The ServiceUtil.isError() and isFailure()
>>>> methods are in use by my services. I neglected to copy them over to my
>>>> example. But what about unexpected exceptions like RuntimeException or
>>>> something that is thrown by the service engine itself. I don't have a
>>>> choice to return failure like I do in my own code but I still want my
>>>> serviceB to commit?
>>>>
>>>> Thanks,
>>>> Matt Bertolini
>>>>
>>>> On 3/22/13 1:46 PM, "Deepak Dixit" <[hidden email]> wrote:
>>>>
>>>>> Matt,
>>>>>
>>>>> As per you code if "doSomething"  service return error then transaction
>>>>> will be roll backed, as if service return error then transaction marked
>>>>> as rollback hence it will rollback the transaction of parent service as
>>>>> well.
>>>>>
>>>>> If doSomething fails to perform business logic then you can return
>>>>> failure from service and then user ServiceUtil.isFailure() to check
>>>>> failure and if this return true then you can run serviceB and return
>>>>> error with errorMsg.
>>>>>
>>>>> So your code looks like this:
>>>>>
>>>>> {code}
>>>>>  try {
>>>>>      Map results = dispatcher.runSync("doSomething", data); // return
>>>>> failure
>>>>>     if (ServiceUtil.isError(results)) {
>>>>> // Service B requires a new transaction and should always commit
>>>>> regardless of outer transaction.
>>>>>        Map  serviceBResults = dispatcher.runSync("serviceB", data);
>>>>>       return
>>>>> ServiceUtil.returnError(ServiceUtil.getErrorMessage(results))
>>>>> }
>>>>>  } catch (GenericServiceException e) {
>>>>>      return ServiceUtil.returnError("message", e.getMessageList());
>>>>>  }
>>>>> {code}
>>>>>
>>>>> Or you can you use another syntax of runSync method for serviceB:
>>>>>
>>>>> {code}
>>>>> try  {
>>>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>>>> error and initiates a rollback.
>>>>> } catch (GenericServiceException e) {
>>>>>     // Service B requires a new transaction and should always commit
>>>>> regardless of outer transaction.
>>>>>       Map serviceBResults = dispatcher.runSync("serviceB", data,
>>>>> 300,
>>>>> true);// Use require new transaction true
>>>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>>>   }
>>>>> {code}
>>>>>
>>>>>
>>>>> Thanks & Regards
>>>>> --
>>>>> Deepak Dixit
>>>>> HotWax Media Pvt. Ltd.
>>>>> www.hotwaxmedia.com
>>>>> Contact :- +91-98267-54548
>>>>> Skype  :- deepakdixit
>>>>>
>>>>> On Mar 22, 2013, at 8:02 PM, Matthew Bertolini wrote:
>>>>>
>>>>>> Sorry for the delayed response. I was swamped with other things. I
>>>>>> have
>>>>>> created a simplified example to demonstrate my code:
>>>>>>
>>>>>> // Outer transaction begins in serviceA
>>>>>> public static Map serviceA(DispatchContext dispatchContext, Map
>>>>>> inputData)
>>>>>> {
>>>>>>   GenericDelegator delegator = dispatchContext.getDelegator();
>>>>>>   LocalDispatcher dispatcher = dispatchContext.getDispatcher();
>>>>>>
>>>>>>   // ...
>>>>>>
>>>>>>   try {
>>>>>>       Map results = dispatcher.runSync("doSomething", data); // Causes
>>>>>> error and initiates a rollback.
>>>>>>   } catch (GenericServiceException e) {
>>>>>>       // Service B requires a new transaction and should always commit
>>>>>> regardless of outer transaction.
>>>>>>       Map serviceBResults = dispatcher.runSync("serviceB", data);
>>>>>>       return ServiceUtil.returnError("message", e.getMessageList());
>>>>>>   }
>>>>>>
>>>>>>   // ...
>>>>>>
>>>>>>   return ServiceUtil.returnSuccess(successMessage);
>>>>>> }
>>>>>>
>>>>>>
>>>>>> I hope this helps illustrate the issue.
>>>>>>
>>>>>> Thanks
>>>>>> Matt Bertolini
>>>>>>
>>>>>> On 3/14/13 11:01 AM, "Nicolas Malin" <[hidden email]>
>>>>>> wrote:
>>>>>>
>>>>>>> Matt can you give me the serviceA code ?
>>>>>>>
>>>>>>> Nicolas
>>>>>>>
>>>>>>> Le 14/03/2013 15:53, Matthew Bertolini a écrit :
>>>>>>>> ServiceA has errored and therefore a rollback has been initiated
>>>>>>>> before
>>>>>>>> serviceB has been called but execution of serviceA has not yet
>>>>>>>> completed.
>>>>>>>> I am not sure what you mean by iterating. Also, I am working in pure
>>>>>>>> java
>>>>>>>> so any minilang solutions will not apply.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Matt Bertolini
>>>>>>>>
>>>>>>>> On 3/13/13 4:12 PM, "Nicolas Malin" <[hidden email]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Matt,
>>>>>>>>>
>>>>>>>>> If the service A has been rollbacked before call the serviceB ?
>>>>>>>>> If you call serviceB on new transaction, the serviceA wait the
>>>>>>>>> serviceB
>>>>>>>>> return so this last has been commited.
>>>>>>>>>
>>>>>>>>> Warn with log if you work with a loop :
>>>>>>>>> Service A :
>>>>>>>>>   <iterate ..>
>>>>>>>>>      <call-service name="serviceB"/>
>>>>>>>>>   </>
>>>>>>>>>
>>>>>>>>> Nicolas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Le 13/03/2013 20:33, Matthew Bertolini a écrit :
>>>>>>>>>> I have two service engine methods in Java. Lets call them serviceA
>>>>>>>>>> and
>>>>>>>>>> serviceB. ServiceA calls serviceB. Both are transactional but
>>>>>>>>>> serviceB
>>>>>>>>>> requires a new transaction. The reason is I want serviceB to
>>>>>>>>>> succeed
>>>>>>>>>> even if serviceA needs to rollback (serviceB is a db audit logging
>>>>>>>>>> method). In this setup, I get the following message when serviceA
>>>>>>>>>> errors:
>>>>>>>>>>
>>>>>>>>>> The current transaction is marked for rollback, not beginning a
>>>>>>>>>> new
>>>>>>>>>> transaction and aborting current operation; the rollbackOnly was
>>>>>>>>>> caused
>>>>>>>>>> by: Service [serviceA] Š
>>>>>>>>>>
>>>>>>>>>> Based on analysis of the database, I can see that serviceA did
>>>>>>>>>> rollback
>>>>>>>>>> as expected but serviceB didn't commit either. Not really sure how
>>>>>>>>>> to
>>>>>>>>>> fix this particular issue. Does "require-new-transaction" not
>>>>>>>>>> really
>>>>>>>>>> work as advertised? What am I missing?
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Matt Bertolini
>>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Nicolas MALIN
>>>>>>>>> Consultant
>>>>>>>>> Tél : 06.17.66.40.06
>>>>>>>>> Site projet : http://www.neogia.org/
>>>>>>>>> -------
>>>>>>>>> Société LibrenBerry
>>>>>>>>> Tél : 02.48.02.56.12
>>>>>>>>> Site : http://www.librenberry.net/
>>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Nicolas MALIN
>>>>>>> Consultant
>>>>>>> Tél : 06.17.66.40.06
>>>>>>> Site projet : http://www.neogia.org/
>>>>>>> -------
>>>>>>> Société LibrenBerry
>>>>>>> Tél : 02.48.02.56.12
>>>>>>> Site : http://www.librenberry.net/
>>>>>>>
>
>
> --
> Nicolas MALIN
> Consultant
> Tél : 06.17.66.40.06
> Site projet : http://www.neogia.org/
> -------
> Société LibrenBerry
> Tél : 02.48.02.56.12
> Site : http://www.librenberry.net/
>