我在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 Collection,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消息,并且加载已停止。
问题: 我理解当两个或多个查询(更新)试图锁定已经持有写锁的URI时会发生DEADLOCK。
我看到以下代码作为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")
答案 0 :(得分:2)
我真的不明白你为什么会遇到僵局。我仍然怀疑MLCP之外的某些东西正在产生这些信息。可能有一些时间表或只是一些完全独立的过程导致消息?
我可以尝试更多地解释有关MLCP的死锁。
当您在更新模式下触摸文件,然后生成,调用或评估触及同一文件的代码时,通常会发生死锁。产生,调用或逐出的请求尚未完成,因此自动读取或写入锁定尚未发布。子进程确实看到了锁,并被迫等待它被释放。父进程将等待子进程完成,因此死锁。
MLCP变得有点复杂,因为MLCP将打开持久的交易,并将发出多个参与同一交易的电话。在整个持久交易发布之前,这些自动锁定不会被释放。因此,如果MLCP尝试在同一事务中两次插入相同的文件,那将是麻烦。
可能有办法检查MLCP是否真的导致了问题。有一些命令行参数可以控制使用的线程数,以及一个事务中包含的请求数。尝试使用:
-transaction_size 1 -batch_size 1
此外,如果您确实希望以顺序方式处理文件,请另外添加:
-thread_count 1
您只需使用import
命令(而不是其他参数)运行MLCP即可获得所有命令行选项的摘要。
HTH!