2015-07-04 4 views
0

Сегодня я столкнулся с странной проблемой. См. Два основных модуля XQuery (это просто примеры, чтобы проиллюстрировать проблему). Первый, когда выполняется против ML7, создает 3 базы данных в базе данных, а второй - не создает. Может ли кто-нибудь объяснить, как эти два модуля отличаются в терминах транзакционной семантики? (Обратите внимание, что первый модуль использует function mapping)сделка с MarkLogic

Модуль 1

xquery version "1.0-ml"; 

declare variable $xml := 
    <root> 
    <child>1</child> 
    <child>2</child> 
    <child>3</child> 
    <child>4</child> 
    </root>; 

declare function local:create-child-method1($child as element(child)) 
{ 
    try { 
    let $num := $child/text() 
    return 
     if($num eq 2) then 
     fn:error() 
     else 
     xdmp:document-insert($num, <sample>{$num}</sample>) 
    } catch ($ex) { 
    $ex 
    } 
}; 

local:create-child-method1($xml/child) 

Модуль 2

xquery version "1.0-ml"; 

declare variable $xml := 
    <root> 
    <child>1</child> 
    <child>2</child> 
    <child>3</child> 
    <child>4</child> 
    </root>; 

declare function local:create-child-method2($child as element(root)) 
{ 
    try { 
    for $each-child in $child/child 
    let $num := $each-child/text() 
    return 
     if($num eq 2) then 
     fn:error() 
     else 
     xdmp:document-insert($num, <sample>{$num}</sample>) 
    } catch ($ex) { 
    $ex 
    } 
}; 

local:create-child-method2($xml) 

ответ

1

Это правильное поведение, и на самом деле не связаны с управлением транзакциями.

В обоих случаях возникает вопрос об ошибке ($num eq 2), но при попытке поймать будет только случай ошибки (num = 2) и тихо продолжать в модуле 1. Но выброс ошибки в модуле 2 остановит весь FLWOR от завершения, поэтому ничего не записывается.

Движение за часть FLWOR за пределами попытки поймать, чтобы сделать модуль 2 ведут себя как модуль 1:

xquery version "1.0-ml"; 

declare variable $xml := <root> 
         <child>1</child> 
         <child>2</child> 
         <child>3</child> 
         <child>4</child> 
        </root>; 

declare function local:create-child-method2($child as element(root)) 
{ 
    for $each-child in $child/child 
    return 
    try { 
     let $num := $each-child/text() 
     return if($num eq 2) then 
        fn:error() 
      else 
        xdmp:document-insert($num, <sample>{$num}</sample>) 
    } catch ($ex) 
    { 
     $ex 
    } 
}; 

local:create-child-method2($xml) 

HTH!