【问题标题】:MarkLogic transactionMarkLogic 事务
【发布时间】:2015-07-04 18:38:28
【问题描述】:

我今天遇到了一个奇怪的问题。请参阅两个 XQuery 主要模块(它们只是说明问题的示例)。第一个,当针对 ML7 执行时,在数据库中创建 3 个文档,而第二个不创建任何文档。有人可以解释一下这两个模块在事务语义方面有何不同吗? (注意第一个模块使用function mapping)

模块 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)

【问题讨论】:

    标签: marklogic


    【解决方案1】:

    这是正确的行为,与事务管理无关。

    错误情况 ($num eq 2) 在这两种情况下都会引发,但 try catch 将仅捕获错误情况 (num = 2),并在模块 1 中静默继续。但在模块 2 中抛出错误将停止整个 FLWOR 都没有完成,所以什么都没有写。

    将 FLWOR 的 for 移到 try catch 之外,使模块 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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2018-08-18
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多