MarkLogic交易
MarkLogic transaction
我今天遇到一个奇怪的问题。请查看两个 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)
这是正确的行为,与事务管理无关。
在这两种情况下都会引发错误情况 ($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!
我今天遇到一个奇怪的问题。请查看两个 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)
这是正确的行为,与事务管理无关。
在这两种情况下都会引发错误情况 ($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!