MarkLogic事务

时间:2015-07-04 18:38:28

标签: marklogic

我今天遇到了一个奇怪的问题。请参阅两个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)

1 个答案:

答案 0 :(得分: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) ),但try catch将仅捕获错误情况(num = 2),并在模块1中静默继续。但是在模块2中抛出错误将阻止整个FLWOR完成,因此不会写任何内容。

将FLWOR的for移动到try catch之外,使模块2的行为类似于模块1:

import csv
reader = csv.reader(open('test.csv'))

result = {}
for column in reader:
    key = column[0]
    if key in result:
        pass
    result[key] = column[1:]
print result

HTH!