MLCP加载抛出DeadLock - MarkLogic 8

时间:2017-09-27 03:51:26

标签: marklogic database-deadlocks marklogic-8 mlcp

我在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。

  1. 我希望mlcp加载的任意数量的线程都能写入数据 一次一个URI。 DEADLOCK怎么可能?
  2. 当一个查询正在等待另一个查询时,为什么称它为DEADLOCK 完成。是不只是排队?
  3. 我看到以下代码作为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")
    

1 个答案:

答案 0 :(得分:2)

我真的不明白你为什么会遇到僵局。我仍然怀疑MLCP之外的某些东西正在产生这些信息。可能有一些时间表或只是一些完全独立的过程导致消息?

我可以尝试更多地解释有关MLCP的死锁。

当您在更新模式下触摸文件,然后生成,调用或评估触及同一文件的代码时,通常会发生死锁。产生,调用或逐出的请求尚未完成,因此自动读取或写入锁定尚未发布。子进程确实看到了锁,并被迫等待它被释放。父进程将等待子进程完成,因此死锁。

MLCP变得有点复杂,因为MLCP将打开持久的交易,并将发出多个参与同一交易的电话。在整个持久交易发布之前,这些自动锁定不会被释放。因此,如果MLCP尝试在同一事务中两次插入相同的文件,那将是麻烦。

可能有办法检查MLCP是否真的导致了问题。有一些命令行参数可以控制使用的线程数,以及一个事务中包含的请求数。尝试使用:

-transaction_size 1 -batch_size 1

此外,如果您确实希望以顺序方式处理文件,请另外添加:

-thread_count 1

您只需使用import命令(而不是其他参数)运行MLCP即可获得所有命令行选项的摘要。

HTH!