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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *