Hi Mary,

Thank you for this clear explanation.  This is excellent news (news to me
at least), I always assumed try/catch were trickier than that WRT errors.

Just out of curiosity, how is that possible efficiently?  I can only
imaging using several MVCC copies, that we create when entering a try
block, and on exiting the block we use either the new copy, or the old one
in case of an error...

Regards,

-- 
Florent Georges
H2O Consulting
http://h2o.consulting/


On 11 December 2017 at 16:27, Mary Holstege wrote:

>
> Updates within the body of the try will be abandoned; updates before or
> after will be kept. That is, as long as they are catchable exceptions. If
> you get an exception in the commit of the whole transaction, all
> transactions will be lost.
>
> That's as far as updates go. Some side-effects are not transactionally
> protected, such as writing to a log file.
>
> //Mary
>
>
> On Mon, 11 Dec 2017 05:17:00 -0800, Florent Georges <[email protected]>
> wrote:
>
> > Hi,
> >
> > I would like to have a confirmation about the handling of side effects
> > (that is, everything related to MVCC) in the context of try/catch.  I
> > always thought that "whatever was executed in a try clause" before an
> > error
> > is raised was going to be kept if the error is caught.
> >
> > I know there is an incertainty WRT the order of execution, but still, I
> > thought some DB modifications called in the try clause could be kept in
> > case the error is caught.
> >
> > Here is an example that tries to replicate the problem, using a recursive
> > function to beat the optimiser (full code at the end of this email):
> >
> >     local:side-effect('before'),
> >     try {
> >       local:recurse(('one', 'two'))
> >     }
> >     catch * {
> >       'Caught error in main module'
> >     },
> >     local:side-effect('after')
> >
> > In the above example, the result is that both /before.xml and /after.xml
> > are created, but not /one.xml (the creation is called during the first
> > iteration of the recursive function though).
> >
> > All the tests I made have the same result: all DB modifications in the
> > try
> > clause are discarded in case an error is raised (regardless it is caught
> > or
> > not).
> >
> > I could not find a definitive answer in the doc.  Is this guaranteed?
> >
> > Full example:
> >
> >     xquery version "3.0";
> >
> >     declare namespace xdmp = "http://marklogic.com/xdmp";;
> >
> >     declare function local:side-effect($name as xs:string)
> >     {
> >       xdmp:document-insert(
> > '/' || $name || '.xml',
> > <hello>{ $name }</hello>)
> >     };
> >
> >     declare function local:recurse($names as xs:string)
> >     {
> >       if ( fn:count($names) eq 1 ) then (
> > fn:error((), 'Climb the stack...')
> >       )
> >       else (
> > local:side-effect(fn:head($names)),
> > local:recurse(fn:tail($names))
> >       )
> >     };
> >
> >     local:side-effect('before'),
> >     try {
> >       local:recurse(('one', 'two'))
> >     }
> >     catch * {
> >       'Caught error in main module'
> >     },
> >     local:side-effect('after')
> >
> > Regards,
> >
>
>
> --
> Using Opera's revolutionary email client: http://www.opera.com/mail/
> _______________________________________________
> General mailing list
> [email protected]
> Manage your subscription at:
> http://developer.marklogic.com/mailman/listinfo/general
>
_______________________________________________
General mailing list
[email protected]
Manage your subscription at: 
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to