我在集群的 2 台 RHEL6 服务器上使用 MarkLogic 8。我在使用 mlcp 加载数据时遇到了 DEADLOCK(通知)错误。细节:
数据:500+ CSV 文件
File name Examples:
File1: 20170927_**ABC**_XX_YY.CSV
File2: 20170927_**DEF**_QX_QY.CSV
File3: 20170927_**DE**_QX_QY.CSV
要求:我需要加载这些文档,同时在加载过程中将每个 CSV 分配给一个集合。所以,File1 应该属于 ABC 集合,File2 应该属于 DEF 集合,File3 应该属于 DE 集合。
脚本:我试图通过使用 mlcp 单独加载每个 CSV 来实现这一点。
#!/bin/sh
listFiles=`ls -l /location/*.CSV | awk '{print $9}'`
for each in $listFiles
do
collName=`echo $each | cut -d_ -f2`
$MLCP_HOME/mlcp.sh import -mode local -options_file connect.txt \
-input_file_path $each -input_file_type delimited_text \
-generate_uri -output_collections $collName
done
问题:某些文件已加载到 MarkLogic 中而没有任何错误。但是,我在日志中看到“通知”级别的 DEADLOCK 消息,并且加载停止。
问题:我了解当 2 个或更多查询(更新)尝试在已持有写锁的 URI 上实现锁定时会发生死锁。
- 我希望任何数量的 mlcp load 线程一次将数据写入一个 URI。死锁怎么可能?
- 为什么当一个查询正在等待另一个查询完成时,它被称为死锁。不就是排队吗?
我看到以下代码是在 marklogic 文档中作为死锁示例给出的。我不明白为什么这是一个僵局。一个命令正在等待另一个命令完成。
(: the next line ensures this runs as an update statement :)
if ( 1 = 2) then ( xdmp:document-insert("foobar", <a/>) ) else (),
doc("/docs/test.xml"),
xdmp:eval("xdmp:node-replace(doc('/docs/test.xml')/a, <b>goodbye</b>)",
(),
<options xmlns="xdmp:eval">
<isolation>different-transaction</isolation>
</options>) ,
doc("/docs/test.xml")