Имя: Пароль:
1C
1С v8
Как создать конфликт блокировок?
0 Lex_Liven
 
07.11.12
06:59
Всем утро.
Имею в рабочей базе довольно частую ошибку "Конфликт блокировок при выполнении транзакции". Это неудивительно - там работает 50 пользователей, а блокировки автоматические.
Вопрос вот в чем: как повторить эту ошибку в тестовой базе, где сижу я один? Тестовая база на том же сервере, что и рабочая - Win 2003x64, SQL 2005, 1C 8.2.15.310.

P.S.: (не главный вопрос) Где почитать про управляемые блокировки? Много придется переписывать, чтобы перейти на них?
1 Wist
 
07.11.12
07:01
(0) а что за база?
2 Wist
 
07.11.12
07:01
(1) + в смысле, что за конфа?
3 Lex_Liven
 
07.11.12
07:04
(1)(2) Наполовину, если не больше, переписанная УТ 10.
4 Zaval
 
07.11.12
07:05
(0) Ставь ЦентрУправленияПроизводительнстью - осторожно, с учетом всех рекомендаций - получишь ответ с точностью до Процедуры()
ЗЫ. Только не умничай(
5 Lex_Liven
 
07.11.12
07:13
(4) Это совет к чему? К постскриптуму? А по главной теме?
6 Рэйв
 
07.11.12
07:15
7 Живой Ископаемый
 
07.11.12
07:18
2(0) Запускаешь два сеанса, ставишь в модуле проведения расходной точку останова, после того как получил остатки для проведения (то есть останавливаешь внутри транзакции)
во втором сеансе (без отладки) тоже пытаешься провести реализацию с теми же товарами с того же склада. Вот она должна споткнуться об блокировку.
8 Zaval
 
07.11.12
07:23
(5) Епт, а ты сам как думаешь?
При работе юзеров пару минут собираешь данные и видишь, какая процедура конфы(при реальной частоте ее вызовов) больше всего грузит систему.
У тебя нет ни малейшего представления, кто тебя трахает, а ты уже с понтами лекарство ищешь.
9 Живой Ископаемый
 
07.11.12
07:27
2(8) ну и например окажется что больше всего грузит систему Запрос.Выполнить() который выполняется в мониторе руководителя или при открытии какого-нибудь журнала.
Если он не станет выполнять этот код, конфликт блокировок не повторится/станет реже?
10 Lex_Liven
 
07.11.12
07:45
(8) Я не ищу, кто грузит систему, я точно знаю, где возникает блокировка. Я хочу повторить ее в базе с одним пользователем.
И с понтами здесь только вы один.

(7) Пытаюсь. По результатам отпишусь.
11 Прохожий
 
07.11.12
07:46
(0) Зачем?
12 Живой Ископаемый
 
07.11.12
07:47
2(10) с одним не выйдет. Нужно с двумя...
Или с одним и фоновым заданием, которое выполняе т обмен например.. В общем должно быть двое.
13 Lex_Liven
 
07.11.12
07:49
(12) Ну это понятно, я имею в виду, что с базой работаю я один.
14 ДенисЧ
 
07.11.12
07:57
(12) С чого бы? Два сеанса под одним юзверем и ага.
15 Живой Ископаемый
 
07.11.12
08:09
(14) ну да, два сеанса, короче. :)
16 vde69
 
07.11.12
08:20
делаешь так
1. заводишь константу "Тестовый функционал"
2. в модуле проведения

Если Константы.ТестовыйФункционал.Получить() Тогда
 Вопрос("Остановка в проведении");



конечно все это можно сделать покультурнее и пошустрее, но думаю смысл понятен... самое интересное что констаной можно будет баловатся и на рабочей :)
17 Fragster
 
гуру
07.11.12
08:47
"а блокировки автоматические"... конфа - адская самописка? тогда не поможет...
18 Fragster
 
гуру
07.11.12
08:48
переход на управляемые
19 Fragster
 
гуру
07.11.12
08:48
(16) тогда будет не взаимоблокировка, а таймаут
20 Fragster
 
гуру
07.11.12
08:49
взаимоблокировка - делаешь запрос на 1 регистр, паузу через предупреждение или там отладчиком, запрос на другой регистр. в другом сеансе - запрос на регистр 2 (в первом сеансе сейчас снимаешь паузу), запрос на регистр 1
21 Fragster
 
гуру
07.11.12
08:50
вместо второго запроса - запись набора, да. или второй запрос "для изменения" на автоматических блокировках, а первый - нет
22 miklenew
 
07.11.12
08:55
1) Делаеш новый регистр сведений с одним измерением.
Заводиш в него две записи "1" и "2"
2) Две обработки
Текст первой
Процедура КнопкаВыполнитьНажатие(Кнопка)
   НачатьТранзакцию();
   НаборЗаписей = ВыбратьЗапись("1");
   Предупреждение("Остановка", 30, "Остановка");
   НаборЗаписей.Записать();
   ВыбратьЗапись("2");
   ЗафиксироватьТранзакцию();
КонецПроцедуры
Функция ВыбратьЗапись(Значение)
   НаборЗаписей = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Измерение1.Установить(Значение);
   НаборЗаписей.Прочитать();
   возврат  НаборЗаписей;
   //НаборЗаписей.Записать();
КонецФункции
Текст второй
Процедура КнопкаВыполнитьНажатие(Кнопка)
   НачатьТранзакцию();
   НаборЗаписей = ВыбратьЗапись("2");
   Предупреждение("Остановка", 30, "Остановка");
   НаборЗаписей.Записать();
   ВыбратьЗапись("1");
   ЗафиксироватьТранзакцию();
КонецПроцедуры
Функция ВыбратьЗапись(Значение)
   НаборЗаписей = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Измерение1.Установить(Значение);
   НаборЗаписей.Прочитать();
   возврат  НаборЗаписей;
   //НаборЗаписей.Записать();
КонецФункции
3) Запускаеш два сеанса.
1 сеанс - 1 обработка
2-сеанс - 2 обработка
Выскакивают предупреждения. Жмём ок. Система уходит на несколько секунд в ступор. А потом выкидывает сообщение о блокировки
23 Lex_Liven
 
07.11.12
09:56
Пардон, Конфликт блокировок происходит не в 1С, а в скуле.
24 GANR
 
10.11.12
19:57
(0) В коде сразу после действия БлокировкаДанных.Заблокировать() ставишь точку останова, доводишь программу до нее, запускаешь ещё 1 сеанс в нем делаешь обращение к заблокированным данным и... приплыли
25 hohol
 
10.11.12
21:22
а нафиг этот цирк? Итак известно, что партии тормозят.
26 lepesha
 
10.11.12
22:11
Как автоматические ни исследуй - толка не будет.
2 + 2 = 3.9999999999999999999999999999999...