8.х Конфликт блокировок при выполнении транзакции

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем rio, 22 мар 2013.

  1. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте.

    - Платформа 1С:Предприятие 8.2 (8.2.13.199);
    - Конфигурация Зарплата и кадры бюджетного учреждения, редакция 1.0 (1.0.35.1);
    - 50 пользователей;
    - Терминальный сервер Win2008R2 Standart;
    - Сервер (2 четырехядерных CPU, 32Gb RAM, RAID5 (146GBx5хSAS дисков 15К об/мин )

    На данный момент, пользователи работают в файловом варианте базы, однако я уже подготовил MS SQL 2008 Standart и в тестовом варианте гоняю базу.

    Как в файловом так и в sql варианте, при "Расчете начислений" вываливается "Конфликт блокировок".


    Сообщение при конфликте блокировок в ms sql:
    _______________________________________________________________________________________________________________
    {Документ.НачислениеЗарплатыРаботникамОрганизаций.МодульОбъекта(7394)}: Ошибка при вызове метода контекста (Записать)
    НаборОсновныеНачисления.Записать(Истина, Ложь, Истина, Ложь);
    по причине:
    Конфликт блокировок при выполнении транзакции:
    Microsoft OLE DB Provider for SQL Server: Транзакция (идентификатор процесса 58) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
    HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=34, Severity=D, native=1205, line=1
    _______________________________________________________________________________________________________________


    У программиста пока ни чего не получается, вот уже начинаю взывать о помощи на форумах.
    Подскажите как устранить ошибку?
    Пишите, даже используя термины, я буду просить перевести программиста.
  2. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    расчет начислений выполняют несколько пользователей одновременно?

    могут заблокироваться на совместителях, например. либо расчеты блокируют слишком много записей в таблице (около 10-15% на больших таблицах), но не одновременно, а постепенно (как зупа и делает), тогда sql блокирует таблицу полностью, работающий в это время другой расчет словит взаимную блокировку
    в случае с зупой (зкбу) словить блокировку проще, чем в с незарплатными конфигурациями.
  3. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Да, расчет начислений выполняют несколько пользователей одновременно.

    Мы моделируем ситуацию без совместителей, пока получается так, что упираемся при начислении примерно в 1500 сотрудников, если один бухгалтер считает 1400 человек, а второй будет считать примерно 101 человека, сработает блокировка таблицы основные начисления, а если второй будет считать 100, то нормально рассчитает.
    Можно ли увеличить количество одновременно производимых записей?
  4. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    тогда вы упираетесь в блокировку всей таблицы со стороны sql

    сделайте обработку, которая будет расчеты проводить последовательно все.
  5. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Не вариант
  6. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    ну тогда остается только уменьшать количество сотрудников, по которым идет расчет в каждом документе.

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

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

    ну единственное, можно увеличить скорость записи на диски, чтобы уменьшить время проведения документов, перестроив raid с 5 на 0+1
  7. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Сегодня сам попробовал расчитывать начисления порциями.
    Одновременно запустил 1С под разными пользователями (3 шт.) считал не по людям а по строкам, 117 + 26 +14 = Конфликт блокировок.

    Считал всего 43 человека (24+5+14) и получил конфликт блокировок...
  8. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    на файловой или sql?
  9. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    На файловой расчитывает, на SQL блокирует.
  10. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    на файловой расчитывает потому что последовательно проводит - там таблицы сразу полностью блокируются и пока один документ не отработает, следующий не начинает.

    вылезает злобная сущность зупы с ее несколькими записываниями по регистрам. делайте последовательное проведение, тут вряд ли чем поможет что другое. в алгоритмы проведения лезть не стоит
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    rio, а у вас в данный момент ms sql, сервер 1С, и терминальный сервер - все крутится на одном сервере, том который указан в 1-м посте?
    Сколько памяти выделено (или сколько сейчас использует) ms sql?
  12. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Что значит делать последовательное проведение?

    Да, все крутится на одном сервере.
    У нас стоит два одинаковых сервера.
    1 - рабочий сервер, файловая 1С + терминальный сервер (50 человек, потреб ляется не более 17ГБ, при самой оживленной работе). Все летает, не считая блокировок.
    2 - резервный сервер, ms sql + сервер 1С + терминальный сервер. Ограничения на потреб ляемую память ms sql не выставлял, сидим я и программист, MS SQL кушает ~ 5-7 Гб.
  13. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Монитор активности
    Запуск расчета начислений под двумя разными пользователями, разных подразделений (на выходе блокировка)

    [​IMG]

    [​IMG]
  14. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Трассировка расчет 1
    http://rghost.ru/44778276

    Трассировка расчет 2
    http://rghost.ru/44778276
  15. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Убираю в конфигурации "Управляемые блокировки" - пишет object lock (в столбце "Ожидание ресурса" монитора активности-процессы)
    Использую в конфигурации "Управляемые блокировки" - пишет page lock (в столбце "Ожидание ресурса" монитора активности-процессы)

    Что управляемые блокировки, что нет - результат один.
  16. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    попробуйте в обработке проведения в самом начале положить управляемую блокировку на весь регистр ОсновныеНачисления (может называться немного по другому, нет зкбу под рукой)

    либо переведите базу в режим изоляции транзакций read commited snapshot (sql 2008r2), может тоже помочь, хотя не факт
  17. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Первым делом это сделал, когда начал бороться с блокировками. Но на сколько я понял из мануала, этот режим позволяет считывать данные без блокировки, а у меня проблема при записи.
    Программист сказал, что попробует выгружать для работы таблицу в память, и блокировать только те записи над которыми будет запись (как-то так).
  18. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    проблема в том, что он не сможет этого сделать, чтобы один раз прочитать все, а потом один раз записать - схема проведения документа предполагает многократные чтение/запись данных в регистр, причем одни данные могут быть связаны с другими только на уровне базы.


    rcs позволяет читать заблокированные данные в версии перед блокировкой, если при такой изоляции взаимоблокировки все равно есть, значит документы пытаются писать либо блокировать одни и те же записи. если ставить блокировку на весь регистр в начале транзакции, то вторая будет в любом случае ждать, пока первая не завершится и взаимную блокировку им устроить не получится.
  19. TopicStarter Overlay
    rio
    Offline

    rio

    Регистрация:
    22 мар 2013
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Донес информацию о блокировке на весь регистр в начале транзакции до программиста (кстати, где-то я уже читал о подобном на просторах интернетов), говорит попробует сделать.

    Блин, хоть самому садись и изучай язык программирования 1С.
  20. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    да тут не 1с. на той же java и c# в таких задачах блокировки ловятся только в путь :)

Поделиться этой страницей