Как я победил блокировки (deadlock)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

63 Comments

  1. Поручик

    Навскидку интересно. Надо бы опробовать.

    Reply
  2. Tiger77

    Очень хорошее описание, однозначно плюс

    Reply
  3. kazah

    Какой программой открывать статью?

    Reply
  4. sCHTASS

    За статью плюс!!! Будет полезной.

    Reply
  5. Minotavrik

    Офисом

    Reply
  6. anig99

    Статья хорошая, но однобокая… Всё-таки, блокировки лучше начать лечить с SQL — нормальное отлаживание регламентных заданий, оптимизированые скрипты, разделение файлов БД по разным дискам и т.д… Поэтому советую переименовать статью, точнее уточнить — режим управляемых блокировок

    Reply
  7. Minotavrik

    anig99 — у меня все регламентные задания настроены. Базы и логи на разных дисках. Серваки новые на каждом 16 гб. ОЗУ. Все как положено, только от блокировок deadlock это не спасает в часы пик юзеры вообще работать не могут. Просто по одной простой причине — последовательная выполнение транзакций, полная изоляция транзакций друг от друга. так что крути не крути а с блокировками в первую очередь нужно через 1с разбираться. Это я сам лично опробывал и имею хорошие результаты.

    Reply
  8. anig99

    (7) сам себе противоречишь… сначала всё настроил для SQL, а потом уже за управляемые взялся… Как ни крути, но то, что при времени проведения документа в несколько минут не вылетает блокировка, пользователя не радует, а просто угнетает в меньшей степени. Просто по твоей статье все начнут врубать управляемые блокировки, хотя можно обойтись и SQL… По моему мнению управлеяемые блокировки — последнее средство, когда SQL достигает предела производительности.

    Reply
  9. Minotavrik

    Да нифига в режиме автоматических блокировок 1с 8.1 работает как 1с 8.0. Т.е. по сути платформу 8.1 разработали для того, чтобы в ней могли работать одновременно много пользователей и колотить документы. Ты почитай книжку «1с предприятие от 8.0 к 8.1»

    Проблема в том, что при проведении в автоматических блокировках накладывается режим блокировки разделяемый и если две транзакции пытаются захватить одни и те же данные у них это получается, после их обработки каждой из транзакций необходимо выполнить исключительную блокировку транзакций для записи этих данных. В итоге ни одна ни другая этого не может сделать без принудительного прекращения одной из них вот это и есть deadlock. В управляемых блокировках, это решается путем наложения исключительной блокировки данных. Я сам до последнего момента сомневался и поразился результатам. Про SQL я не спорю если у тебя не настроены регламентные задания это увеличит блокировки, но как бы ты их не настраивал ты их не решишь одим sql. У меня с 5 — 7 вечера 40 операторов колотят накладные по 50 — 200 позиций в каждой. А у тебя база какого размера? Сколько юзеров работают?

    Reply
  10. Minotavrik

    а за управляемые я взялся потому, что результата не было.

    Reply
  11. German

    Пересказ(Ctrl+C-Ctrl+V) Книги от 8.0 к 8.1.

    Не рассмотрена проблема эскалации.

    P.S. Блокировка на удаление движений нафиг не нужна.

    Reply
  12. Minotavrik

    Ну насколько помню я ссылки на книгу дал. И во всей статье на нее ссылаюсь.

    Не рассмотрена проблема эскалации — я что то не понял там, что в заголовке статьи написано ЭСКАЛАЦИЯ БЛОКИРОВОК.

    Это вообще отдельная большая тема.

    Пишешь, на русский язык для людей переводишь, с примерами код готовый выкладываешь, а народ еще фукает и говрит не рассмотрена проблема такая то, я что к тебе на защиту диплома пришшел, не нравится не бери.

    Reply
  13. anig99

    120 гБ — 30-50 пользователей.

    Проблем с текущим проведение нет никаких. Проблемы начинаются, когда начинают перепроводить задним числом, тогда начинает решать тюнингованность sql.

    А вообще я и не говорю о том, что всё можно решить одним sql. Я говорю о том, что сначала нужно решить проблемы с sql, а потом уже делать управляемые блокировки…ну по крайней мере сделать управляемые, но не забыть про sql.

    (10) другой вопрос… сколько времени на проведение одного документа уходит?

    Reply
  14. Minotavrik

    Мало, ожидание на блокировках по времени значительно снизилось, замерял по конфигурации ЦУП. Да и потом, ожидание возникает в случае, если один склад одна номенклатура. Ну по словам операторов, им настало счастье.

    Reply
  15. German

    (12)

    В статье только сказано:

    Поискав литературу в нете, нашел только книгу «1с предприятие от 8.0 к 8.1» начинаю судорожно изучать драгоценную главу «блокировки данных».

    Вы очень не глубоко изучили этот вопрос и уже пишите слово «победил».

    Вас почитают многие люди и сядут в лужу, то что у Вас все (3!!! документа) заработало просто счастливое стечение обстоятельств (мало данных и хорошее железо).

    Не слово про измерения и индексы. Про разделяемый режим.

    Reply
  16. German

    (12) Я выразил свое мнение, нужно было поставить минус без комментариев? — тогда бы Вы еще больше расстроились.

    я что к тебе на защиту диплома пришшел, не нравится не бери.

    Вашу статью закачал обратно на IS. 😀

    Reply
  17. Minotavrik

    Ну если 7 000 документов «Реализация товаров и услуг» в день это мало, тогда я не могу представить много.

    А за основу я взял типовую конфигурацию 1с, насколько я знаю там оптимально это дело настроено (я про индексы говорю). Да и потом, про сядут в лужу, мне это помогло я решил поделится, еще никто не запрещал перед глобальными изменениями делать бекап.

    Этот вопрос я изучал около 2-х месяцев и многое перепробывал с настройками sql, ощутимых результатов я не увидел.

    3 документа это чудо?

    1 — случайность

    2 — свопадение

    3 — закономерность.

    Да и никого я не заставляю это делать. А инфы про управляемые блокировки в нете действительно мало. Книги 1с в свободное скачивание тоже не предостовляются.

    Reply
  18. Арчибальд

    (15) Автор не пишет «как победить». Он делится информацией о том, как «он победил» в конкретной ситуации. Так что дезинформацией здесь и не пахнет.

    Но конечно же, право на минус у Вас имеется…

    Reply
  19. German

    (17) забейте если для Вас это критично я могу аннулировать свой минус.

    вы просто не описали достаточно Важные вещи, о которых вы наверняка знаете. Просто могли упомянуть о них в статье для затравки, а более подробно описать потом. И Ваши читатели бы знали что не все так просто.

    Reply
  20. Minotavrik

    Я не стал читателей уводить в дебри, я сам, когда читал про эскалацию блокировок чуть мозг не сломал. Про это можно почитать тут http://www.gilev.ru/1c/81/lock/lock.htm но там не написано, конкретно если вы сделаете это, то настанет вам счастье.

    Reply
  21. Gilev.Vyacheslav

    21 Неодназначное впечатление

    1. Статья начиналась как собственное понимание, а закончилась как ЖКК, т.е. нечитаемо, ну или я лично не осилил.

    2. Способ помещения задач на проведения под одного пользователя практикуется в УПП давно. Я так понял, вы работали только с УТ и поэтому об этом либо не знали, либо вводите нас в заблуждение

    3. Раз уж упомянули мою статью, отвечу:

    лучше всего бороться с эскалацией в MS SQL Server 2008, без всяких управляемых блокировок

    КАК БОРОТЬСЯ — это мой хлеб, за деньги готов продать свои знания

    4. Почему вы не разложили действия этого пользователя по нескольким фоновым процедурам для НЕПЕРЕСЕКАЕМЫХ данных?

    5. Радует одно, вы пишите за бесплатно, тем самым заполняя информационный вакуум

    я не считаю, раз есть книжки от 1С, значит их дублировать не надо

    но пожалуйста не копипастите их, а пишите полностью СВОИ мысли

    пусть они буду с ошибками, но Вы же сами и научитесь в результате

    по крайней мере, у меня получается учиться таким образом

    рейтинговать не буду ввиду изложенного

    надеюсь без обид

    Reply
  22. Minotavrik

    4. Почему вы не разложили действия этого пользователя по нескольким фоновым процедурам для НЕПЕРЕСЕКАЕМЫХ данных? вот эта интересная мысль.

    2. Я работаю под SQL server 2005.

    А Управляемыми блокировками решил воспользоваться, т.к. мне интересно показалось. А они чем то плохи? Просто не каждый знает все тонкости SQL server.

    Reply
  23. Gilev.Vyacheslav

    (22) дело не в том, хороши они или плохи.

    В УПП все Вами сказанное есть, в том числе управлемые блокировки.

    С другой стороны, заново изобретать велосипед не зазорно, мысли не могут иметь копирайта.

    Про эскалацию — управляемые блокировки не могут спасти от эскалации, просто эскалация будет не на субд, а на кластере 1С.

    Не правильный, но самый простой метод, который могу озвучить бесплатно — дробление количества движений на более мелкие порции.

    Reply
  24. CheBurator

    Софтпоинт недавно проводил семинар по гибким блокировкам и дедлокам, также они обещали выложить материалы семинара в открытый доступ — нудо бы их пнуть (?) за обещанное…

    http://www.softpoint.ru/info_id103.htm

    Reply
  25. CheBurator

    ууу. начал читать статью.. на первых же шагах — «траблы»

    ..»нарисовалась такая проблема как блокировки (deadlock), собственно о них в дальнейшем и пойдет речь. Блокировка — это информация о том, данный ресурс захвачен «кем то» для выполнения какого-то действия.»

    .

    ну… из того, что я «усвоил» 😉 блокировки и дедлоки — это не одно и то же… Условно: блокировка — рано или поздно кончается, дедлок — это навсегда… 😉

    Reply
  26. Gilev.Vyacheslav

    народ, только не пинайте человека

    он же СТАРАЛСЯ, а не продает что-то

    Reply
  27. CheBurator

    (26) ни в коем же случае! любой кто знает больше чем «я» — уже вызывает уважение…

    Reply
  28. Gilev.Vyacheslav

    :)))

    Reply
  29. sss999

    а я могу и просто так плюсы ставить,а корифеи зазнались уже 😮 ,там кто то написал что плюст а сам не поставил вот идиот

    Reply
  30. MSensey

    Цитата «нарисовалась такая проблема как блокировки (deadlock)»

    Блокировки это не проблема.

    Ожидание на блокировках это пробема и дедлоки это проблема.

    Кроме того не понятно почему deadlock написано в скобках к словку «блокировки», дедлок и блокировка это разные вещи.

    Reply
  31. MSensey

    «… нам необходимо сохранить целостность данных, поэтому при проведении и обработки удаления проведения необходимо указать какие записи регистров блокировать».

    Не понятно зачем при удалении проведения ставить УБ?

    Рекомендую ознакомиться как сделаны УБ в УПП — она полностью переведена на УБ.

    Reply
  32. MSensey

    Вот цитата К. Рупосова (1С):

    Если очень коротко, то ответ такой: все будет в порядке, платформа автоматически позаботиться обо всем, кроме одного – чтения данных в транзакции. Если вы хотите, чтобы до конца транзакции никто не смог изменить данные, которые вы прочитали, то вам нужно установить на них блокировку. Классический пример – контроль остатков. Вы прочитали остатки, приняли решение и начали записывать движения (в том числе списывать остатки). Если это происходит в автоматическом режиме, то все будет хорошо. Если в управляемом, то ваше чтение не защищено и кто-нибудь может списать ваши остатки после того, как вы приняли решение, но до того, как вы записали движения. В этом случае, ваши проводки могут оказаться некорректными (остатков, на которые вы рассчитывали, может уже не быть).

    Reply
  33. MSensey

    В итоге ставлю статье «минус» — все было сведено к переводу на УБ и при этом присутствуют неверные решения.

    Reply
  34. mosAdm

    (31)

    >Рекомендую ознакомиться как сделаны УБ в УПП — она полностью переведена на УБ

    Я что-то пропустил? Или речь идет о: «ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ,,истина,РежимПроведения);»

    Вся типовая конфигурация УПП с работает в режиме блокировок «Автоматический»

    Reply
  35. MSensey

    (34) Нет речи о «ОбщегоНазначения.УдалитьДвиженияРегистратора». Причем оно здесь?

    >> Вся типовая конфигурация УПП с работает в режиме блокировок «Автоматический»

    По умолчанию да. Но с версии 1.2.15 появилась возможность включить управляемый режим.

    Reply
  36. mosAdm

    (35)

    то что появилась возможность совсем не означает «она полностью переведена на УБ «.

    Для перевода корпеть и корпеть программисту ручками.

    Да и режим блокировок не зависит от релизов конфигурации.

    Или о чем речь идет? может прямо пример из текста типовой УПП?

    Reply
  37. MSensey

    (36) Не понимаю, что я должен написать, чтобы Вы восприняли «она полностью переведена на УБ»?

    В описании нового и в конференции написано, что можно установить режим управления блокировкой — «Управляемый».

    Или Вы не верете тому, что она полностью переведена на УБ?

    Ну что же оставайтесь при своем, а в тоже время многие уже установили в УПП этот режим и довольны.

    Reply
  38. mosAdm

    (37)

    Действительно пропустил, спасибо.

    Речь идет о процедуре общего модуля «УстановитьУправляемуюБлокировку», которая вызывается если изменён соответствующий флаг свойств конфигурации.

    Reply
  39. Minotavrik

    Спасибо за совет! я про УПП говорю. А в статье возможно где-то не так выразился. На критику каждый имеет право.

    Reply
  40. German

    (34) не полностью только склад(партии) и взаиморасчеты ну и еще по мелочи, к сожалению на производство у них сил не хватило.

    Reply
  41. mosAdm

    (40) Да, полностью согласен. И утверждение «она полностью переведена на УБ» будет соответствовать действительности когда в типовой демке в свойствах конфигурации будет установлен флаг «Управляемый».

    Хотя должен признать, что программисту здорово облегчена работа и вместо «корпеть и корпеть» больше подходит «делай как я».

    Reply
  42. MSensey

    (40) А мог бы ты сказать в каком месте производства не хватает УБ?

    Reply
  43. German

    (42) Да все производственные регистры.

    Может напишу расширенную статью по этому поводу в своем блоге.

    Reply
  44. CheBurator

    из того что я себе представляю: не может быть универсального решения на управляемых блокировках. все зависит от частностей — от темпов проведения доков, от характера самих доков и от много другого.. то есть чтобы сделать эффективные УБ — надо на живой базе или на тестовом стенде на объемах данных близким к реальным погонять и померять…

    ????

    Reply
  45. MSensey

    (44) есть общие правила по которым можно определить необходимость управляемой блокировки

    Reply
  46. Winston

    Статья очень хорошая. Спасибо, помогла.

    Reply
  47. CheBurator

    (45) речь не про это, а про то, что сам код упр.блокировок — будет зависеть от многих причин. т.е. упрощенно может потребоваться перетасовка порядка проведения по разным регистрам…

    Reply
  48. Minotavrik
    Статья очень хорошая. Спасибо, помогла.

    очень рад, что пригодилась.

    Reply
  49. Minotavrik
    из того что я себе представляю: не может быть универсального решения на управляемых блокировках. все зависит от частностей — от темпов проведения доков, от характера самих доков и от много другого.. то есть чтобы сделать эффективные УБ — надо на живой базе или на тестовом стенде на объемах данных близким к реальным погонять и померять…
    ????

    Категорически согласен. Каждую конфигурацию надо рассматривать отдельно.

    Reply
  50. vika64

    хочу попробовать воспользоваться вашим опытом. У нас терминальный режим, СКЛ 2000, управление торговлей 8.1. для беларуси. 20 пользователей. Документы заказ покупателя и реализация. и куча регистров к ним. Реализация проводится на завтра. Помогут ли здесь управляемые блокировки и могу ли я испортить базу, например остатки по минусу пойдут?

    Reply
  51. Sergant

    Спасибо автору за статью. Спасибо за расширенеи моего кругозора.

    Побольше бы подобных статей где вы будете делится своими успехами и неудачами. Плюс.

    Reply
  52. expert.1c8

    Интересна как сама статья, так и комменты к ней, причем даже негативные..

    надо больше таких статей, которые пусть и с какими-то недостатками, но описывают реальный опыт внедрения…

    Reply
  53. legawww

    Интересная статья, спасибо

    Reply
  54. legawww

    Я так понимаю что управляемые блокировки плюс установка исключительной блокировки в транзакции убирают возникновение ошибки deadlock, но у меня она все равно появляется при проведении двух разных документов Заказ покупателя, которые резервируют товар и в которых одинаковые товары

    Reply
  55. elena_77

    Статья полезная. Спасибо.

    Reply
  56. nnurik

    Много полезного узнала. Спасибо.

    Reply
  57. cannabis_86

    Я новичок в 1спрограммировании. Для меня оказалось полезным.

    Reply
  58. Sairys

    Интересная статья, я так понимаю блокировки которые выставлены в автоматическом режиме выполнаются на стороне СУБД. А управляемые на стороне платформы 8

    Reply
  59. AlexanderKai

    Не все конечно удалось исправить, но некоторые моменты из статьи для себя почерпнул.

    Reply
  60. kernst

    Мне для общего развития не лишнее. Хотя конечно все поверхостно. С блокировками нужно читать полноценные статьи, чтобы в них разобраться.

    Reply
  61. AlexandrRo

    Посоветуйте, пожалуйста, как отловаить дедлок, в профайлере 5-6 раз в день вылезает, журнале регистрации видно что транзакция отваливается, поделитесь опытом как вы определяете где копать ?

    Reply
  62. trade85

    ага. мне тоже интересно

    Reply
  63. Smart_Fox

    Статья тупо слизана из книжки «Профессиональная разработка»!!!

    И не стыдно за такой плагиат еще и «СтарМани» требовать?!

    Ничего нового в статье на две страницы текста не почерпнул 🙁

    Не советую это качать не тратьте время и деньги. вот такая же статья но на халяву 🙂

    http://1cexpo.ru/informacziya/27-blokirovki-dannyx-v-1spredpriyatii-8.html

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *