Я использую MarkLogic 8 на 2 серверах RHEL6, которые сгруппированы в кластер. Я столкнулся с ошибками DEADLOCK (уведомление) при загрузке данных с помощью 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 коллекции во время загрузки. Итак, File1 должен принадлежать коллекции ABC, File2 должен принадлежать коллекции DEF, а File3 должен принадлежать коллекции DE.
Сценарий: я пытался добиться этого, загружая каждый CSV индивидуально с помощью mlcp.
#!/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 уровня «Уведомление», и загрузка останавливается.
Вопрос: я понимаю, что DEADLOCK возникает, когда 2 или более запросов (обновлений) пытаются заблокировать URI, который уже содержит блокировку записи.
- Я надеялся, что любое количество потоков загрузки mlcp будет записывать данные в один 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")