MLCP加载引发死锁-MarkLogic 8

MLCP加载引发死锁-MarkLogic 8,marklogic,database-deadlocks,marklogic-8,mlcp,Marklogic,Database Deadlocks,Marklogic 8,Mlcp,我在集群的2台RHEL6服务器上使用MarkLogic 8。 我在使用mlcp加载数据时遇到死锁(注意)错误。详情: 数据: 500多个CSV文件 File name Examples: File1: 20170927_**ABC**_XX_YY.CSV File2: 20170927_**DEF**_QX_QY.CSV File3: 20170927_**DE**_QX_QY.CSV 要求: 我需要加载这些文档,同时在加载过程中将每个CSV分配给一个集合。 因此,文件1应该属于ABC集合,文

我在集群的2台RHEL6服务器上使用MarkLogic 8。 我在使用mlcp加载数据时遇到死锁(注意)错误。详情:

数据: 500多个CSV文件

File name Examples:
File1: 20170927_**ABC**_XX_YY.CSV
File2: 20170927_**DEF**_QX_QY.CSV
File3: 20170927_**DE**_QX_QY.CSV
要求: 我需要加载这些文档,同时在加载过程中将每个CSV分配给一个集合。 因此,文件1应该属于ABC集合,文件2应该属于DEF集合,文件3应该属于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中,没有任何错误。 但是,我在日志中看到了“通知”级别的死锁消息,加载被暂停

问题: 我知道当两个或更多的查询(更新)试图在已经持有写锁的URI上实现锁时,就会发生死锁

  • 我希望任何数量的mlcp加载线程都能写入数据 一次转换为一个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")
    
    (:下一行确保它作为更新语句运行:)
    如果(1=2),那么(xdmp:documentinsert(“foobar”),else(),
    doc(“/docs/test.xml”),
    xdmp:eval(“xdmp:node replace(doc('/docs/test.xml')/a,再见)”,
    (),
    不同交易
    ) ,
    doc(“/docs/test.xml”)
    
    我真的不明白为什么会出现死锁。我仍然怀疑MLCP之外有什么东西在产生这些信息。是否有一些时间表或只是一些完全独立的过程导致了这些消息

    我可以试着解释一下关于MLCP的死锁

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

    由于MLCP将打开持久的事务,并且将发出多个参与同一事务的调用,因此MLCP变得稍微复杂一些。在整个持久事务被释放之前,这些自动锁不会被释放。因此,如果MLCP尝试在同一事务中插入同一文件两次,那将是一个麻烦

    可能有一种方法可以检查是否真的是MLCP造成了问题。有几个命令行参数可以控制使用了多少线程,以及一个事务中包含了多少请求。尝试使用:

    -transaction_size 1 -batch_size 1
    
    此外,如果确实希望以顺序方式处理文件,请另外添加以下内容:

    -thread_count 1
    
    您可以只使用
    import
    命令(不使用其他参数)运行MLCP,以获得所有命令行选项的摘要


    是否存在MLCP转换?或者CPF或触发器?没有在mlcp命令中看到的转换。未激活CPF/触发器。这是一个普通的mlcp加载。这些CSV文件中有多少行?您可以发布一个记录死锁的URI示例吗?生成的URI是否与预期模式匹配,即filename-split-sequence.xml?您是否在内容数据库上启用了目录创建?非常感谢@grtjn。我想我在某种程度上明白了。我想这是因为我进行了集群设置。如前所述,我有两台集群服务器。但我没有提到的是,两台服务器上各有一个林。i、 e,Forest1位于服务器1存储上,Forest2位于服务器2存储上。此外,这两台服务器位于不同的网络上。我移走了一片森林,所有的人都跑得很好。尽管如此,我还是想知道为什么即使有这样的设置也会出现死锁?我确实添加了集群服务器,并尝试了选项-transaction\u size、-batch\u size和-thread\u count。我看到当我没有提到-thread\u count[即,当thread\u count默认为4]时,死锁就会发生。在这样的设置中,似乎有更多的线程导致MLCP在一个事务中多次访问同一文档。我觉得这很奇怪!请帮助理解原因。您可能在MLCP中发现了错误。你能试试最新的MLCP吗?如果没有帮助的话,考虑把票归档,你是对的!我用的是8-0-6版本。9-0-3(最新版本)没有抛出此类“通知”级别的死锁错误[虽然速度非常慢…但不知道我可以分配的最大线程数是多少:)]