|
Опять про управляемые блокировки | ☑ | ||
---|---|---|---|---|
0
Alex_MA
03.08.11
✎
14:52
|
Все доброго дня уважаемые коллеги!
Есть определенные правила: 1.Проблема повторного изменения. (Нельзя одновременно изменять одни и те же данные) 2.Проблема "грязного" чтения. (нельзя читать уже измененные, но еще не записанные данные) 3.Проблема неповторяемого чтения. (Нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений) 4.Фантомы. (Нельзя вводить новые данные (удалять имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении) Все вроде понятно. А как реализовать ? Сеанс №1(Пользователь Петров): Вот, например, возьмем п.2. Например мы изменяем записи во "ВзаиморасчетыСКонтрагентами" (имя пространства блокировок "Ссылка", т.е. по конкретному регистратору). Сеанс №2(Пользователь Иванов): Хочет получить в какой то процедуре обороты по регистру "ВзаиморасчетыСКонтрагентами". - Выходит, при таком стечении обстоятельств надо блокировать всю таблицу "ВзаиморасчетыСКонтрагентами", т.к. Сеанс №2 может получить не правильные данные ? исключительная блокировка ? |
|||
1
Господин ПЖ
03.08.11
✎
14:58
|
>Все вроде понятно. А как реализовать ?
что реализовать? в скуле уже все реализовано применением различных уровней изоляции транзакций |
|||
2
ptiz
03.08.11
✎
14:59
|
(0)
Про грязное чтение неправильно написано: проблема в том, что считываются данные, которые записаны, но транзакция не зафиксирована. "Хочет получить в какой то процедуре обороты по регистру" - смотря по каким измерениям. Если хочет по "Покупателю1", а исключительная блокировка наложена на "Покупателя2", то проблем нет. Если хочет данные по "Покупателю2" - пусть ждет. |
|||
3
Alex_MA
03.08.11
✎
14:59
|
(1)реализовать управляемые
|
|||
4
Alex_MA
03.08.11
✎
15:02
|
наверно я немного недопонимаю когда накладывать "Исключительную", а когда "Разделяемую блокировку"
подскажите пожалуйста |
|||
5
Azn
03.08.11
✎
15:02
|
Всегда исключительную
|
|||
6
Reset
03.08.11
✎
15:06
|
(4) Исключительную - когда собираешься изменять данные (чтоб никто не причитал пока меняешь)
Разделяемую - когда читаешь данные и хочешь чтобы во время выполнения твоей транзакции эти данные были актуальным (что бы никто не изменил пока ты анализируешь) |
|||
7
Господин ПЖ
03.08.11
✎
15:08
|
ниже Read Committed уровнень изоляции не падает, откуды вы возьмете грязное чтение? грязное есть только в списках, так это ради того и делалось чтобы не тормозить
|
|||
8
Alex_MA
03.08.11
✎
15:09
|
(7)Read Uncommitted ? Или нет ?
|
|||
9
5 Элемент
03.08.11
✎
15:10
|
тебе же сказали что нет
|
|||
10
Alex_MA
03.08.11
✎
15:10
|
(6)т.е. достаточно придерживаться этого правила и все Ок ?
|
|||
11
Господин ПЖ
03.08.11
✎
15:11
|
(8) в списках хинты втыкаются With(NoLock) что для конкретного запроса и будет Read Uncommitted
|
|||
12
5 Элемент
03.08.11
✎
15:12
|
(6) разделяемую нужно ставить только в том случае если ты два раза одно и тоже читаешь
|
|||
13
Azn
03.08.11
✎
15:12
|
Любое нетранзакционное чтение, это Read Uncommitted
|
|||
14
5 Элемент
03.08.11
✎
15:14
|
(13) вообще-то Read Uncommitted только в транзакции ))
|
|||
15
Azn
03.08.11
✎
15:16
|
(14) вообще-то поизучай документацию ))
|
|||
16
Azn
03.08.11
✎
15:16
|
(14) я как бы про транзакции 1С
|
|||
17
5 Элемент
03.08.11
✎
15:16
|
что ты называешь нетранзакционным чтением?
|
|||
18
Alex_MA
03.08.11
✎
15:17
|
||||
19
Alex_MA
03.08.11
✎
15:19
|
(12)я надеюсь два раза не читается при проведении в типовых конфигурациях ? А то как то не весело становиться.
|
|||
20
Azn
03.08.11
✎
15:20
|
(17) то и называю - выборка данных вне транзакции, такое есть в отчетах и списках
|
|||
21
Alex_MA
03.08.11
✎
15:21
|
А если подвести все все правила, то можно сделать вывод:
Исключительная: 1.когда собираешься изменять данные (чтоб никто не причитал пока меняешь) 2. Еще есть варианты ? 3. Еще есть варианты ? Разделяемая: 1. когда читаешь данные и хочешь чтобы во время выполнения твоей транзакции эти данные были актуальным (что бы никто не изменил пока ты анализируешь) 2.нужно ставить только в том случае если ты два раза одно и тоже читаешь |
|||
22
Azn
03.08.11
✎
15:23
|
(19) нет, нигде ничего два раза не читается. Вообще использование управляемой разделяемой блокировки вопрос спорный, т.к. если кто-то поменяет данные не во время транзакции а сразу после неё, то легче от этого не будет. Так, например, в УПП 1.3 разделяемых блокировок нет совсем
|
|||
23
5 Элемент
03.08.11
✎
15:23
|
(21) они и без исключительной не прочтут после изменения.
исключительная не для этого |
|||
24
Alex_MA
03.08.11
✎
15:35
|
1. т.е при переводе на упр. блокировку, к примеру, документа "РеализацияТоваровУслуг" выставить его свойство РежимУправленияБлокировкой в Управляемый, а так же все регистры, которые он двигает.
2.В обработке проведения (ИМХО подписку использовать не получиться, т.к. подписка "ОбработкаПроведения" срабатывает после модуля объекта. Или как то можно сделать, чтобы не писать код в каждом модуле объекта, который хотим перевести на упр. блокировки ?) написать код блокирования объектов. Для всех блокируемых объектов использую "Исключительную" блокировку. Так ? |
|||
25
5 Элемент
03.08.11
✎
15:38
|
Смысл управляемых блокировок как раз в том чтобы разрешить изменять данные которые были прочитаны.
Поэтому не нужно ставить блокировку на прочитанные данные иначе теряется смысл. |
|||
26
5 Элемент
03.08.11
✎
15:38
|
(24) ты собрался постепенно переводить?
|
|||
27
rs_trade
03.08.11
✎
15:39
|
(14) вот оно чё. будем знать!
|
|||
28
Alex_MA
03.08.11
✎
15:41
|
(26)да
|
|||
29
patapum
03.08.11
✎
15:43
|
(25) смысл управляемых блокировок - блокировать необходимый диапазон, а не всю таблицу - насколько я понимаю. а не ставить блокировку - это отсутствие блокировки
|
|||
30
5 Элемент
03.08.11
✎
15:44
|
(29) с этим и автоматические справляются.
|
|||
31
NcSteel
03.08.11
✎
15:45
|
(30) Не прав.
|
|||
32
5 Элемент
03.08.11
✎
15:46
|
(31) в чем не прав??? в автоматическом режиме блокируется вся таблица??
|
|||
33
patapum
03.08.11
✎
15:47
|
(32) может быть не вся, но больший диапазон точно
|
|||
34
Господин ПЖ
03.08.11
✎
15:48
|
любая ветка про блокировки доставляет...
|
|||
35
Alex_MA
03.08.11
✎
15:48
|
(34)ага
|
|||
36
NcSteel
03.08.11
✎
15:48
|
(32) Либо вся (файловая), либо намного больший диапозон.
|
|||
37
NcSteel
03.08.11
✎
15:49
|
(34) курить меньше надо.
|
|||
38
5 Элемент
03.08.11
✎
15:49
|
(36) файловая )) типа отмазался?
|
|||
39
NcSteel
03.08.11
✎
15:50
|
(38) Ты давал ложное утверждение , я его опроверг. Где отмазы?
|
|||
40
Господин ПЖ
03.08.11
✎
15:50
|
(33) с куали вдруг?
|
|||
41
5 Элемент
03.08.11
✎
15:51
|
(29) >> а не ставить блокировку - это отсутствие блокировки
READ COMMITED в управляемом режиме никто не отменял, так что блокировка будет |
|||
42
rs_trade
03.08.11
✎
15:52
|
(38) у тебя какие то своеобразные понятия о блокировках.
|
|||
43
patapum
03.08.11
✎
15:52
|
тогда объясните, мудрые, зачем такой текст приводится в примерах по управляемые блокировки?
ЭлементБлокировки.ИсточникДанных = ЭтотОбъект.Товары; ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); |
|||
44
Azn
03.08.11
✎
15:52
|
(40) Ну как, плюс одна запись вверх и плюс одна вниз, это намного больший :)
|
|||
45
Alex_MA
03.08.11
✎
15:53
|
мне дак казалось, если используется Автоматический режим, то блокируется вся таблица, а если Управляемая, то выделенный диапазон (По имени пространства блокировок)
|
|||
46
5 Элемент
03.08.11
✎
15:53
|
(39) прочти внимательно что я отрицал "блокировать необходимый диапазон, а не всю таблицу".
В этой фразе управляемая блокировка описывается как решение проблемы "а не всю таблицу". Я сказал что эту проблему прекрасно решает автоматическая. Что я не прав? |
|||
47
apokrit
03.08.11
✎
15:54
|
Прикольная ветка - сборник заблуждений ;)
|
|||
48
Alex_MA
03.08.11
✎
15:55
|
(47):)))), присоединяйся
|
|||
49
Reset
03.08.11
✎
15:55
|
(45) Зависит от СУБД
(47) Точно |
|||
50
5 Элемент
03.08.11
✎
15:55
|
(47) Если я в чем то заблуждаюсь то давай напиши в чем
|
|||
51
Alex_MA
03.08.11
✎
15:56
|
(49)а, ну да, точно. На постгрях не прокатит. У нас MS SQL
|
|||
52
Reset
03.08.11
✎
15:56
|
"Смысл управляемых блокировок как раз в том чтобы разрешить изменять данные которые были прочитаны."
В мемориз |
|||
53
5 Элемент
03.08.11
✎
15:57
|
(49) уверен что все тут обсуждают MS SQL.
Прикрывать верность своих высказываний другими СУБД не профессионально. |
|||
54
Господин ПЖ
03.08.11
✎
15:57
|
(45) >мне дак казалось, если используется Автоматический режим, то блокируется вся таблица, а если Управляемая, то выделенный диапазон (По имени пространства блокировок)
скуль не тупее прочих... |
|||
55
Alex_MA
03.08.11
✎
15:57
|
(52)тогда блокировать одной "Исключительная" не катит
|
|||
56
5 Элемент
03.08.11
✎
15:57
|
(52) хочешь сказать это не так?
|
|||
57
patapum
03.08.11
✎
15:58
|
кто считает, что не надо ставить блокировки в управляемом режиме, на (43) кто нибудь ответить может?
|
|||
58
5 Элемент
03.08.11
✎
15:58
|
(52) посмотри внимательно чем отличается READ COMMITED от SERIALIZABLE и поймешь зачем используется более низкий уровень изоляции
|
|||
59
Господин ПЖ
03.08.11
✎
15:59
|
>"Смысл управляемых блокировок как раз в том чтобы разрешить изменять данные которые были прочитаны."
скорее так - "отпускать" ненужные данные сразу после чтения, а не держать до конца проведения документа... |
|||
60
Alex_MA
03.08.11
✎
16:00
|
(59)тогда блокировать одной "Исключительная" не катит. так ?
|
|||
61
5 Элемент
03.08.11
✎
16:01
|
(59) я об этом и написал, а (52) считает что это не так
|
|||
62
patapum
03.08.11
✎
16:01
|
(59) отпускать ненужные данные - согласен. а нужные то держать?
|
|||
63
Alex_MA
03.08.11
✎
16:01
|
блин, создал ветку, теперь все в "кашу" превратилось :)
|
|||
64
patapum
03.08.11
✎
16:01
|
(63) миста, однако...
|
|||
65
Господин ПЖ
03.08.11
✎
16:02
|
>блин, создал ветку, теперь все в "кашу" превратилось :)
потому-то читают разные "мурзилки" от 1С про яблоки... http://www.1cexpo.ru/informacziya/27-blokirovki-dannyx-v-1spredpriyatii-8.html |
|||
66
Alex_MA
03.08.11
✎
16:03
|
(65)мурзилку такую и прочитал, только называется от 1с8.0 к 1с8.2
|
|||
67
5 Элемент
03.08.11
✎
16:03
|
А умники только и могут писать "сборник заблуждений", "В мемориз"
|
|||
68
rs_trade
03.08.11
✎
16:04
|
||||
69
Господин ПЖ
03.08.11
✎
16:05
|
(60) виды блокировок по существу отличаются только совместимостью между собой... shared с shared совместима, shared с exclusive - нет
|
|||
70
ptiz
03.08.11
✎
16:06
|
(7) ХЗ какое там "COMMITED", но в 1С столкнулись с такой ситуацией:
1) проводится документ 2) в обработке проведения (секунд 7) он создает другой документ 3) этот новый документ успевают увидеть юзеры и нажать кнопку "Печать" (транзакция не завершена) 4) первый документ по какой-то причине не проводится, транзакция откатывается, второй документ исчезает |
|||
71
rs_trade
03.08.11
✎
16:07
|
(69) исключительная у 1С это UpdateLock
|
|||
72
Reset
03.08.11
✎
16:07
|
(67) Забавный ты. Расскажи, для чего существует Разделяемый режим? Когда "2 раза читаешь" ? :))) Накуя 2 раза читать одно и тоже? То есть - вообще для понту добавили?
|
|||
73
patapum
03.08.11
✎
16:10
|
В режиме автоматических блокировок для таблиц итогов используется блокировка СУБД по диапазону индекса (во всяком случае, в MS SQL), а для режима управляемых группировок используются блокировки СУБД уровня строк.
Т.е. если у тебя автоматические блокитровки, то заблокируется диапазон по индексу от босоножек до сапог - а что еще попадет - уж извините... а управляемые - заблокируют босоножки и сапоги, ничего больше. я не прав? |
|||
74
rs_trade
03.08.11
✎
16:11
|
(70) в формах списка грязное чтение. быстрые у вас однако юзеры
|
|||
75
ptiz
03.08.11
✎
16:13
|
(74) Угу. Быстро работают :)
А я потом чесал репу - как они умудряются печатать несуществующие документы. |
|||
76
5 Элемент
03.08.11
✎
16:15
|
(72) ну напиши для чего она нужна?
|
|||
77
Reset
03.08.11
✎
16:17
|
(76) Т.е. не нужна? :D
|
|||
78
patapum
03.08.11
✎
16:17
|
(76) в качестве ответа (73) не годится?
|
|||
79
Azn
03.08.11
✎
16:18
|
||||
80
Reset
03.08.11
✎
16:18
|
(78) Там ответ(один из) на другой вопрос.
|
|||
81
5 Элемент
03.08.11
✎
16:21
|
(77) см (76)
|
|||
82
Reset
03.08.11
✎
16:22
|
(81) Понял тебя,отстал.
|
|||
83
5 Элемент
03.08.11
✎
16:24
|
(82) ты игнорируешь просьбы объяснять свои ответы (см (52)), у меня нет желания тебе объяснять свои.
|
|||
84
5 Элемент
03.08.11
✎
16:37
|
Возможность изменить данные, которые были прочитаны, дает гораздо большую эффективность, чем уменьшение диапазона заблокированных записей. Поэтому об этом я написал в первую очередь.
|
|||
85
Господин ПЖ
03.08.11
✎
16:39
|
(71) давайте мухи отдельно, котлеты отдельно...
update lock - это понятие скуля, в 1С это "хинт" в селекте "ДЛЯ ИЗМЕНЕНИЯ" нечто среднее между shared и exclusive. "Я хочу читать данные, а потом возможно что-то в них изменю". |
|||
86
Господин ПЖ
03.08.11
✎
16:41
|
>Возможность изменить данные, которые были прочитаны, дает гораздо большую эффективность, чем уменьшение диапазона заблокированных записей.
формально скуль может всех послать и заблокировать всю таблицу если его "достать" |
|||
87
5 Элемент
03.08.11
✎
16:51
|
(86) он что до конца транзакции ее поставит?
|
|||
88
Alex_MA
03.08.11
✎
16:52
|
Прочитал (68). Там в основном обсуждение идет РегистрНакопленияНаборЗаписей.БлокироватьДляИзменения
Для УПП 1.3 считаю не целесообразным использования данного свойства, т.к. в типовой конфе проводим по принципу: 1.Смотрим остатки 2.Проводим или не проводим (Например, в зависимости от остатков) а не 1.Проводим 2.Смотрим остатки (если что то не устраивает по алгоритму - откат транзакции) Правильно ? |
|||
89
Alex_MA
03.08.11
✎
16:53
|
(88)+ для БлокироватьДляИзменения должна быть "заточена" конфа
|
|||
90
Alex_MA
03.08.11
✎
17:19
|
я еще вернусь в эту ветку :)
|
|||
91
Alex_MA
04.08.11
✎
08:33
|
Вообщем правильно ли я понял:
1.В обработке проведения блокируем "Исключительной" те данные которые будут изменены. 2."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа. (Т.е. те регистры, из которых мы просто получаем информацию, записывать туда не будем). Так ? |
|||
92
Jolly Roger
04.08.11
✎
08:36
|
(91) ага...
|
|||
93
Alex_MA
04.08.11
✎
08:41
|
Теперь вопрос по оптимизации написания кода перевода конфигурации на управляемые блокировки.
Если необходимо переводить много документов, то неужели нужно в каждом модуле объекта писать свой код. Или как то подпиской можно обойтись (Хотя вряд ли) ? Например подписки на события срабатывают после одноименных событий объекта, когда бы нужно уже установить блокировки |
|||
94
Fragster
гуру
04.08.11
✎
08:47
|
(93) смотри, как в УТ11 сделано
|
|||
95
Jolly Roger
04.08.11
✎
08:51
|
(93) переводишь конфигу полностью на упр. блокировки? будешь использовать разделение итогов и контроль отрицательных остатков после записи набора?
|
|||
96
Alex_MA
04.08.11
✎
08:56
|
(94)там не понятно. Например есть процедура
// Процедура устанавливает блокировку на набор записей регистра накопления "Расчеты с клиентами по документам". // // Параметры: // МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - Менеджер временных таблиц // Процедура УстановитьБлокировкуТаблицыРасчетыСКлиентамиПоДокументам(МенеджерВременныхТаблиц) а она ниоткуда не вызывается, глоб. поиском не нашел |
|||
97
Alex_MA
04.08.11
✎
08:58
|
(95)Некоторые документы, платежные поручения входящие, ПКО, Оплата от покупателя платежной картой.
(95)На использование "БлокироватьДляИзменения" намекаешь ? |
|||
98
5 Элемент
04.08.11
✎
09:03
|
(93) у тебя полное непонимание того как работают блокировки
|
|||
99
Alex_MA
04.08.11
✎
09:05
|
(98)ты без сорказма ?
|
|||
100
Jolly Roger
04.08.11
✎
09:07
|
(97) намекаю на то, что просто заюзать УБ - это лишь малая часть оптимизации. основной резерв увеличения параллельности - в алгоритмах проведения...
|
|||
101
Alex_MA
04.08.11
✎
09:09
|
(100)без этого никуда, согласен
|
|||
102
5 Элемент
04.08.11
✎
09:28
|
(99) конечно без, УБ нужно ставить до выполнения запроса, о каких подписках может идти речь?
|
|||
103
Alex_MA
04.08.11
✎
09:36
|
(102)согласен
По (59) есть вопрос. >>"отпускать" ненужные данные сразу после чтения, а не держать до конца проведения документа... Отпускает блокировка только тогда, когда закончилась транзакция. Проведение это одна транзакция. Следовательно, чтобы последовать совету (59) нужно в обработке проведения создавать вложенную транзакцию для чтения некоторых данных ? |
|||
104
5 Элемент
04.08.11
✎
09:42
|
(103) блокировка снимается после чтения до завершения транзакции
|
|||
105
Jolly Roger
04.08.11
✎
09:46
|
(103) нЕчему там следовать. следуй тому что у тебя в (91) и плюс нюанс: в автоматической транзакции, если регистр перед записью не читаешь, исключительную блокировку ставить не надо - платформа ее сама поставит...
|
|||
106
Jolly Roger
04.08.11
✎
09:46
|
(104) ты бы уточнил про какую блокировку речь - про управляемую или на скуле...
|
|||
107
5 Элемент
04.08.11
✎
09:47
|
Совет как ставить УБ:
1. Ищи в коде запросы в которых есть "ДЛЯ ИЗМЕНЕНИЯ" 2. Перед выполнением этих запросов ставь исключительную блокировку по нужным данным на таблицу которая указана в "ДЛЯ ИЗМЕНЕНИЯ". Примеры ищи в типовых, например в УПП. |
|||
108
Alex_MA
04.08.11
✎
09:49
|
(105)Ок, спасибо
(105)Я так понимаю про SQL-ную (107)Ага, это в курсе, спасибо |
|||
109
5 Элемент
04.08.11
✎
09:53
|
(105) ну и каша, в автоматической транзакции
- нет исключительных блокировок - платформа не ставит блокировки, это делает СУБД |
|||
110
Jolly Roger
04.08.11
✎
09:54
|
(109) бугага! а мужики-то не знают...
|
|||
111
Reset
04.08.11
✎
09:55
|
(103) "Отпускает блокировка только тогда, когда закончилась транзакция" - Верно.
(91) "2."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа" - Верно. Нюанс в том, что "необязательно" блокировать все. Можно, например, не блокировать данные, изменение которых "маловероятно" (яркий пример-учетная политика), либо "некритично". В том и фишка, что, понимая логику работы, управляешь процессом сам. В Автоматическом режиме блокируется все, что читаешь в транзакции; в управлямом ты блокируешь только то, что действительно необходимо. + Даже исключительную блокировку можно иногда не накладывать на изменяемые данные (например, при записи в оборотные регистры) (108) "ДЛЯ ИЗМЕНЕНИЯ" - не имеет смысла в управляемом режиме. |
|||
112
5 Элемент
04.08.11
✎
09:57
|
(110) очередной троль? ты будешь обосновывать свое бугага?
хотя о чем, я на мисте одни бугага и тусуются) |
|||
113
Alex_MA
04.08.11
✎
09:59
|
(111)Понял. наконец то начинает вырисовываться общая картина.
(112)Из (59) следует, что можно повысить параллельность путем вложенных транзакций в обработке проведения. Так ? |
|||
114
Reset
04.08.11
✎
10:00
|
(113) НЕТУ в 1С вложенных транзакций.....
|
|||
115
5 Элемент
04.08.11
✎
10:01
|
(113) >> "Отпускает блокировка только тогда, когда закончилась транзакция" - Верно.
Это верно для автоматического режима. В управляемом см (104). |
|||
116
Reset
04.08.11
✎
10:03
|
(115) У тебя реально каша в понимании вопроса :(
|
|||
117
rs_trade
04.08.11
✎
10:04
|
(113) что понять про уровни изоляции и блокировки достаточно почитать любую литературу с примерами по t-sql. и только после осознания работы механизма блокировок СУБД переходить к тому как это реализовано в 1С и читать мурзилки от 1С.
|
|||
118
5 Элемент
04.08.11
✎
10:04
|
(116) до сих пор я только и слышу что я неправ, но никто не написал в чем? может ты напишешь?
|
|||
119
Jolly Roger
04.08.11
✎
10:07
|
(118) как минимум ты не прав в том, что не различаешь управляемые блокировки и блокировки на сервере БД...
|
|||
120
rs_trade
04.08.11
✎
10:08
|
+(117) рекомендую, автор Ицик Бен-Ган.
|
|||
121
Alex_MA
04.08.11
✎
10:08
|
А вот в таком коде, что будет:
(117)соглашусь. //Все объекты имеют св-во "РежимУправленияБлокировкой = Управляемый" Процедура ОбработкаПроведения(Режим, Отказ) НачатьТранзакцияю(); //Чтение регистра1, на основании которых проводим документ //Устанавливаем на него упр. блокировку ("Разделяемая") ЗафиксироватьТранзакцию(); //После фиксации транзакции этот регистр1 разблокируется //Далее пишем, к примеру, в регистр2 данные ("Исключительная") // КонецПроцедуры Так правильно ? |
|||
122
Alex_MA
04.08.11
✎
10:10
|
(120)спасибо
|
|||
123
Alex_MA
04.08.11
✎
10:10
|
(121)исходя из
http://gyazo.com/6efb9bba9e6ad860e0f7f6f182612e0c.png |
|||
124
Reset
04.08.11
✎
10:11
|
(121)
Процедура ОбработкаПроведения(Режим, Отказ) //Устанавливаем на него упр. блокировку ("Разделяемая") //Чтение регистра1, на основании которых проводим документ // Блокируем исключительно регистр2 //Далее пишем, к примеру, в регистр2 данные КонецПроцедуры //После фиксации транзакции этот регистр1 разблокируется |
|||
125
Reset
04.08.11
✎
10:12
|
(121) Транзакцию начинать не надо - она уже начата в режиме, который установлен у документа.
Фиксировать тоже. Если нужно отменить, использовать параметр Отказ в обрабоке события |
|||
126
5 Элемент
04.08.11
✎
10:13
|
(119) ткни пальцем, где выражено мое непонимание?
Ты не видишь в каком контексте написаны сообщения и делаешь такие выводы. Блокировка SQL снимается до завершения транзакции (мы говорили об этих блокировках). А управляемые блокировки после завершения транзакции (я с этим не спорил). |
|||
127
Jolly Roger
04.08.11
✎
10:15
|
(126)
в (109) "- платформа не ставит блокировки, это делает СУБД" |
|||
128
5 Элемент
04.08.11
✎
10:16
|
(127) ты хочешь сказать, что в автоматической транзакции блокировки ставит 1С?
|
|||
129
5 Элемент
04.08.11
✎
10:18
|
Или ты снова потерял контекст?
|
|||
130
Reset
04.08.11
✎
10:18
|
(127) Не корми тролля)
|
|||
131
5 Элемент
04.08.11
✎
10:19
|
Троли как раз вы. Еще не разу не обосновали свои бугага.
Я в отличии от вас все обосновал. |
|||
132
Jolly Roger
04.08.11
✎
10:21
|
(130) да он похоже не тролль, просто матчасть мало курил :-)
|
|||
133
rs_trade
04.08.11
✎
10:22
|
(129) твои высказывания относительно блокировок, кроме тебя никто не понимает.
Вот опять, взять хотя бы: Блокировка SQL снимается до завершения транзакции. А управляемые блокировки после завершения транзакции. Можешь пояснить смысл сего высказывания? |
|||
134
Jolly Roger
04.08.11
✎
10:22
|
(128) да, об этом даже на итс написано...
зы: цитату не приведу, щас нет по рукой... |
|||
135
5 Элемент
04.08.11
✎
10:22
|
(132) матчасть ты плохо учил если пишешь такое "в автоматической транзакции, если регистр перед записью не читаешь, исключительную блокировку ставить не надо - платформа ее сама поставит"
|
|||
136
5 Элемент
04.08.11
✎
10:23
|
(134) мда, щас ты начнешь рассказывать про объектные блокировки, которые вообще тут не в тему. ты реально слился.
|
|||
137
Jolly Roger
04.08.11
✎
10:24
|
(136) можешь считать, что я слился. успехов...
|
|||
138
Reset
04.08.11
✎
10:24
|
Писец )
|
|||
139
5 Элемент
04.08.11
✎
10:30
|
(133) что тут пояснять?
>> Блокировка SQL снимается до завершения транзакции. При чтении SQL ставит блокировку, которая снимается до звершения тразакции >> А управляемые блокировки после завершения транзакции Управляемые блокировки ставятся в 1С, они снимаются после завершения транзакции |
|||
140
5 Элемент
04.08.11
✎
10:35
|
(137) и буду считать, т.к. в автоматическом режиме 1С не ставит блокировок.
|
|||
141
Alex_MA
04.08.11
✎
10:36
|
я так понимаю спор идет, из за того, что мы не разделяем блокировки 1С и блокировки СУБД.
Надо как то разграничивать было в постах. |
|||
142
Alex_MA
04.08.11
✎
10:38
|
хватит господа спорить, давайте подведем итог совместными усилиями, я думаю он не только мне пригодится
|
|||
143
Alex_MA
04.08.11
✎
10:39
|
(142)+и в книгу знаний :)
|
|||
144
Alex_MA
04.08.11
✎
10:57
|
Вообщем у меня исходя из данной темы и чтения, как некоторые сказали "мурзилок", все свелось к следующему:
1.Документ устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый" 2.Анализируем обработку проведения. Всем объектам, которые считываются или изменяются в обработке проведения устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый". Следим, чтобы внутри "Управляемых блокировок" не было "Автоматических" (Ошибка), а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой" (Управляемая блокировка не будет установлена). Перед запросами с "ДЛЯ ИЗМЕНЕНИЯ" устанавливаем "Исключительную" блокировку. 3.В обработке проведения блокируем "Исключительной" те данные которые будут изменены. 4."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа. (Т.е. те регистры, из которых мы просто получаем информацию, записывать туда не будем). 5.Явные вызовы транзакций в обработке проведения НачатьТранзакцию() переводим в управляемый режим НачатьТранзакцию(РежимУправленияБлокировкой.Управляемый) |
|||
145
Reset
04.08.11
✎
11:04
|
(144) п5 - Не нужно. Режим ты установил уже в п1.
|
|||
146
5 Элемент
04.08.11
✎
11:06
|
п.1. >> чтобы внутри "Автоматической блокировки" не было "Управляемой"
Это можно не проверять. Ошибки не будет, блокировка будет установлена. п.3. не понятно зачем п.4. не понятно зачем п.5. да, если это первая транзакция. |
|||
147
5 Элемент
04.08.11
✎
11:07
|
(145) нужно если это первая транзакция
|
|||
148
Alex_MA
04.08.11
✎
11:08
|
(146)перепутал, ошибка, если внутри Управляемой Автоматическая
|
|||
149
Alex_MA
04.08.11
✎
11:09
|
(147)а если она в обработке проведения, тогда не нужно. так ?
|
|||
150
Alex_MA
04.08.11
✎
11:09
|
(145)п.5. убираем
|
|||
151
Alex_MA
04.08.11
✎
11:10
|
(150)+ точнее дополняем его из (147)
|
|||
152
Alex_MA
04.08.11
✎
11:10
|
5.Явные вызовы транзакций в обработке проведения
НачатьТранзакцию() трогать не нужно, т.к. это "вложенная в кавычках" транзакция |
|||
153
5 Элемент
04.08.11
✎
11:11
|
(149) если она только в обработке проведения, то зачем она вообще нужна?
|
|||
154
Alex_MA
04.08.11
✎
11:11
|
(153)а х его з, вдруг кто то написал :)
|
|||
155
Alex_MA
04.08.11
✎
11:14
|
>>п.3. не понятно зачем
>>п.4. не понятно зачем У меня были "непонятки", пусть остаются эти пункты, вдруг найдется тоже кто то непонятливый :) |
|||
156
5 Элемент
04.08.11
✎
11:15
|
(155) могу переформулировать
п.3. не нужно п.4. не нужно |
|||
157
Alex_MA
04.08.11
✎
11:17
|
Вообщем у меня исходя из данной темы и чтения, как некоторые сказали "мурзилок", все свелось к следующему:
1.Документ устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый" 2.Анализируем обработку проведения. Всем объектам, которые считываются или изменяются в обработке проведения устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый". Следим, чтобы внутри "Управляемых блокировок" не было "Автоматических" (Ошибка), а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой" (Управляемая блокировка не будет установлена). Перед запросами с "ДЛЯ ИЗМЕНЕНИЯ" устанавливаем "Исключительную" блокировку. 3.В обработке проведения блокируем "Исключительной" те данные которые будут изменены. 4."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа. (Т.е. те регистры, из которых мы просто получаем информацию, записывать туда не будем). 5.Если в обработке проведения встречается НачатьТранзакцию(), оставляем все как есть, т.к. это "вложенная в кавычках" транзакция. Если в коде (где-то, не в обработке проведения) встречается НачатьТранзакцию() переводим ее в "Управляемый режим" НачатьТранзакцию(РежимУправленияБлокировкой.Управляемый) |
|||
158
Alex_MA
04.08.11
✎
11:18
|
2.Анализируем обработку проведения. Всем объектам, которые считываются или изменяются в обработке проведения устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый". Следим, чтобы внутри "Автоматических блокировок" не было "Управляемых" (Ошибка), а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой" (Управляемая блокировка не будет установлена). Перед запросами с "ДЛЯ ИЗМЕНЕНИЯ" устанавливаем "Исключительную" блокировку
|
|||
159
Alex_MA
04.08.11
✎
11:20
|
1.Документ устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый"
2.Анализируем обработку проведения. Всем объектам, которые считываются или изменяются в обработке проведения устанавливаем свойство "УправлениеБлокировкойДанных = Управляемый". Следим, чтобы внутри "Автоматических блокировок" не было "Управляемых" (Ошибка), а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой" (Управляемая блокировка не будет установлена). Перед запросами с "ДЛЯ ИЗМЕНЕНИЯ" устанавливаем "Исключительную" блокировку 3.В обработке проведения блокируем "Исключительной" те данные которые будут изменены. 4."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа. (Т.е. те регистры, из которых мы просто получаем информацию, записывать туда не будем). 5.Если в обработке проведения встречается НачатьТранзакцию(), оставляем все как есть, т.к. это "вложенная в кавычках" транзакция. Если в коде НЕ В ТРАНЗАКЦИИ (где-то, не в обработке проведения) встречается НачатьТранзакцию() переводим ее в "Управляемый режим" НачатьТранзакции(РежимУправленияБлокировкой.Управляемый) Вроде так вот правильно будет |
|||
160
5 Элемент
04.08.11
✎
11:21
|
(159) такое нельзя заносить в БЗ
|
|||
161
Alex_MA
04.08.11
✎
11:21
|
Спасибо всем большое за помощь. Все очень помогли.
|
|||
162
5 Элемент
04.08.11
✎
11:22
|
Все объяснения в пустую... мда
|
|||
163
Alex_MA
04.08.11
✎
11:23
|
(162)Ну ее надо как то доработать, дополнить кодом, примерами. Лично мне тема думаю помогла. Дальше запущу ЦУП и буду смотреть, что будет происходить.
|
|||
164
Alex_MA
04.08.11
✎
11:24
|
Вообще "допилил" бы ее кто по нормальному и выложил бы в книгу знаний.
|
|||
165
Alex_MA
04.08.11
✎
11:25
|
(162)что опять то не так ?
|
|||
166
5 Элемент
04.08.11
✎
11:27
|
(165) вот это
а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой"
|
|||
167
Reset
04.08.11
✎
11:27
|
(159) "Если в обработке проведения встречается НачатьТранзакцию()," - так как ты написал, без параметров,
а режим конфигурации Управляемый либо АвтоматическийИУправляемый+в документе Управляемый, то произойдет ошибка времени выполнения. правильно: "Если в обработке проведения встречается НачатьТранзакцию()" --> "настучать по тыковке тому, кто это написал". (165) Не обращай внимания, в общих чертах ты все правильно понял. |
|||
168
Reset
04.08.11
✎
11:29
|
Для помещения в базу знаний повода не вижу, т.к. это элементарные сведения + расписанные в документации. Впрочем, решать не мне.
|
|||
169
Alex_MA
04.08.11
✎
11:33
|
(168)Естественно, этого маловато, надо развить, расписать поподробнее, агрегировать все что написано в "мурзилках". Чтобы человек мог найти в одном месте исчерпывающую для себя информацию по блокировкам в "1С" в одном месте.
|
|||
170
5 Элемент
04.08.11
✎
11:37
|
Уже все давно агрегировано и подробно расписано в http://kb.1c.ru/articleView.jsp?id=30
Очередной раз убеждаюсь что мисте только флудить умеют. Никакого профессионального диалога не получается. |
|||
171
Alex_MA
04.08.11
✎
11:40
|
(170)А я и не флужу. Я пароля не знаю.
|
|||
172
Reset
04.08.11
✎
11:40
|
(169) В (170) Первый раз правильная мысль (в первой строке)
Твоя задача сейчас самому разобраться) Писать руководства сейчас тебе явно рано (без задней мысли, не обижайся) |
|||
173
Alex_MA
04.08.11
✎
11:41
|
(172)я не обижаюсь :)
|
|||
174
5 Элемент
04.08.11
✎
11:46
|
||||
175
5 Элемент
04.08.11
✎
11:48
|
(171) можно и без пароля почитать тоже самое здесь http://lavelin.ru/index.php/article/1c/54-razrabotka/136-blokirovki-dannyh-v-1spredpriyatii-8
|
|||
176
Alex_MA
04.08.11
✎
12:53
|
Последний вопрос, если в обработке встречается такое:
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт //{{Установка блокировки(Begin 25.08.2011 //Тут блокируем //End)}} Структура = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(?(ДатаКурса = Дата('00010101'),ТекущаяДата(),ДатаКурса), Новый Структура("Валюта", Валюта)); Возврат Структура; КонецФункции // ПолучитьКурсВалюты() Все так ? Перешел к практике |
|||
177
Alex_MA
04.08.11
✎
12:55
|
ну или
Код МО: // //блокируем "КурсыВалют" //ПроцедураБлокировки(); //////////////////////////////// Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт Структура = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(?(ДатаКурса = Дата('00010101'),ТекущаяДата(),ДатаКурса), Новый Структура("Валюта", Валюта)); Возврат Структура; КонецФункции // ПолучитьКурсВалюты() |
|||
178
Alex_MA
04.08.11
✎
13:01
|
А вот и двойное чтение этого регистра нашел (дописка-самоделка):
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт Структура = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(?(ДатаКурса = Дата('00010101'),ТекущаяДата(),ДатаКурса), Новый Структура("Валюта", Валюта)); Возврат Структура; КонецФункции // ПолучитьКурсВалюты() Первый раз вызывается, когда формируется СтруктураШапкиДокумента, а второй раз еще для каких-то целей Если мы установим блокировку управляемую "разделяемую" при первом вызове и втором что будет ? Параметры ПолучитьПоследнее одни и те же |
|||
179
Alex_MA
04.08.11
✎
13:02
|
ладно, сейчас испытаем
|
|||
180
5 Элемент
04.08.11
✎
13:15
|
У тебя что курсы будут меняться?
|
|||
181
Alex_MA
04.08.11
✎
13:27
|
(180)нет, я просто попробовать
|
|||
182
Alex_MA
04.08.11
✎
13:29
|
||||
183
Alex_MA
04.08.11
✎
13:38
|
хм, но однако есть одна странность:
//Вот я заблокировал РежимБлокировки = РежимБлокировкиДанных.Исключительный; Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КурсыВалют"); ЭлементБлокировки.УстановитьЗначение("Период", НачалоДня(Дата)); ЭлементБлокировки.УстановитьЗначение("Валюта", ВалютаДокумента); Блокировка.Заблокировать(); Далее: http://gyazo.com/119b6730a30598c12a2dc439ab2c2be0.png - и это понятно. Далее делаю запрос в консоли ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют И он мне выбирает данные, хотя наверно не должен, ведь у меня исключительная блокировка регистра В чем моя ошибка ? |
|||
184
Jolly Roger
04.08.11
✎
14:13
|
(183) запрос-то не в транзакции...
|
|||
185
Alex_MA
04.08.11
✎
14:25
|
(184)точно :)
|
|||
186
Alex_MA
04.08.11
✎
14:50
|
(184)А почему если вид блокировки "Разделяемая" она не дает открыть ФормуЗаписи ?
http://gyazo.com/119b6730a30598c12a2dc439ab2c2be0.png |
|||
187
Jolly Roger
04.08.11
✎
16:43
|
(186) судя по (183) - исключительная...
|
|||
188
GoldenDawn
04.08.11
✎
16:50
|
а в типовых уже есть где-то управляемые блокировки?
|
|||
189
Alex_MA
04.08.11
✎
16:53
|
(187)запустил отладку:
http://gyazo.com/182e700bb19a7e3bb57c1f8b6fef03f5.png и в параллельном сеансе попытался открыть форму записи заблокированного элемента http://gyazo.com/ce0c38d0a06719daf08ed83c24b1b006.png (188)да, есть |
|||
190
Alex_MA
04.08.11
✎
16:55
|
(188)Вроде как в Бухгалтерии 2.0 или УТ11
|
|||
191
Axel2009
04.08.11
✎
17:15
|
а теперь рассказываю =))
автоматические блокировки - блокировки на уровне СУБД. управляемые блокировки - блокировки на уровне 1с сервера (файловая в файликах хранится инфа про блокировки). теперь про "отпускание" которое тут все так дружно обсуждают =))) автоматические блокировки никогда не отпускают блокировки до окончания транзакции. можете что угодно творить и делать. если блокировка навешана в открытой транзакции, то она будет висеть до ее закрытия или отмены транзакции в СУБД. управляемые блокировки будут висеть до окончания транзакции и отменить эту блокировку вы так же не сможете, потому что 1ска не дала такого метода, как "Разблокировать", как у объектов типа справочник, документ и т.д. управляемые блокировки введены только потому, что все таблицы 1с для регистров имеют кластерный ключ, где первое поле - Период. при записи в регистр накопления - блокируется первым делом диапазон записей по периоду, в случае оперативного проведения (случай всем понятный) - блокируется диапазон от последней записи в регистре до +бесконечность для любых других измерений. соответственно провести 2 документа оперативно одновременно вы не сможете никогда. а управляемые блокировки блокируют измерения, таким образом если нет пересечений измерений, то возможно одновременной оперативное проведение документов. теперь что касается отчетов, любой отчет при формировании вешает хинт на выборку (nolock) таким образом вы хоть что делайте, но избавиться от грязного чтения в момент формирования отчета нельзя. |
|||
192
Axel2009
04.08.11
✎
17:19
|
(189) тоже самое через консоль забацай =)
|
|||
193
Jolly Roger
04.08.11
✎
17:20
|
(189) исключительный. у тебя отладчик под рукой, проверь :-)
|
|||
194
5 Элемент
04.08.11
✎
17:20
|
(191)>> соответственно провести 2 документа оперативно одновременно вы не сможете никогда
Вот это заявление, не страшно что растерзают? |
|||
195
Jolly Roger
04.08.11
✎
17:21
|
+(193) в смысле режим блокировки исключительный
|
|||
196
Axel2009
04.08.11
✎
17:22
|
(194) ну попробуй. потом терзай
|
|||
197
Господин ПЖ
04.08.11
✎
17:25
|
>управляемые блокировки введены только потому, что все таблицы 1с для регистров имеют кластерный ключ, где первое поле - Период. при записи в регистр накопления - блокируется первым делом диапазон записей по периоду, в случае оперативного проведения (случай всем понятный) - блокируется диапазон от последней записи в регистре до +бесконечность для любых других измерений. соответственно провести 2 документа оперативно одновременно вы не сможете никогда. а управляемые блокировки блокируют измерения, таким образом если нет пересечений измерений, то возможно одновременной оперативное проведение документов.
какие ваши доказательства? тексты запросов и sp_lock в студию... |
|||
198
5 Элемент
04.08.11
✎
17:26
|
(196) я смогу провести документ в котором не будет совпадать номенклатура?
|
|||
199
Axel2009
04.08.11
✎
17:30
|
(197) тестил на платформе 8.1.14 год назад. будет время - завтра напишу простую конфигу на эту тему.
(198) если период записи у обоих документов в регистр накопления будет больше, чем последняя запись в самом регистре - не сможешь |
|||
200
5 Элемент
04.08.11
✎
17:30
|
(199) будет интересно посмотреть, ждемс..
|
|||
201
Axel2009
04.08.11
✎
17:32
|
(197)+ тогда я разбирался с диапазонами как они в скуле навешиваются.. сейчас на память уже не помню..
|
|||
202
5 Элемент
04.08.11
✎
17:41
|
(196) Сделал простую базу все прекрасно проводится, что не так?
|
|||
203
fisher
04.08.11
✎
17:42
|
(202) Выкладывай свою простую базу и рассказывай как проверял.
|
|||
204
5 Элемент
04.08.11
✎
17:45
|
||||
205
Axel2009
04.08.11
✎
17:45
|
(202) база хоть надеюсь скулная??
|
|||
206
fisher
04.08.11
✎
17:45
|
Не знаю, как сейчас, а когда я глядел на проблемы автоматических блокировок то ли в 8.0, то ли в 8.1 - то при проведении по регистрам все было очень и очень грустно.
|
|||
207
fisher
04.08.11
✎
17:46
|
(204) Щаз глянем.
|
|||
208
5 Элемент
04.08.11
✎
17:46
|
Проверял так
1. в первом сеансе поставил точку останова после Движения.Записать() и провел новый документ. 2. во втором сеансе создал новый документ и провел. |
|||
209
Господин ПЖ
04.08.11
✎
17:47
|
интересно как вы эти эксперименты проводите... не смотря в блокировки, планы выполнения, сброса процедурного кеша и т.п. а потом какие-то частные случаи натягивая на все...
в простой ситуации "Допустим, у нас есть диапазон значений от A до B. Если мы хотим прочитать какое-либо значение С, которое находится между A и B, но не равно им" скуль имеет 2 варианта поведения в зависимости от того существует C или нет |
|||
210
Axel2009
04.08.11
✎
17:48
|
(210) я смотрел в блокировки когда тестировал.
|
|||
211
5 Элемент
04.08.11
✎
17:49
|
(209) он говорил про запись
при записи в регистр накопления - блокируется первым делом диапазон записей по периоду, в случае оперативного проведения (случай всем понятный) - блокируется диапазон от последней записи в регистре до +бесконечность для любых других измерений. соответственно провести 2 документа оперативно одновременно вы не сможете никогда |
|||
212
Господин ПЖ
04.08.11
✎
17:50
|
(210) ну первая часть (191) вопросов не вызывает, а во второй что происходит? везде чистые блокировки на KEY и все?
|
|||
213
Axel2009
04.08.11
✎
17:51
|
(212) блокировки вида Range от последней записи по периоду до +ffffffff
|
|||
214
Господин ПЖ
04.08.11
✎
17:56
|
(211) это вопросов не вызывает.
интересно про упр. блокировки "по измерениям" |
|||
215
Axel2009
04.08.11
✎
18:01
|
(208) тут мы сталкиваемся с "удивительной" особенностью умной 1с. при записи в регистр накопления 1с проверяет, есть ли записи уже в регистре, если есть, то по номерам строк проверяет все реквизиты. если все все совпадает, то физической записи в таблицы не происходит, фактически все остается так как было до проведения.
попробуй у открытого последнего документа исправить количество. тогда мы "заставим" 1ску физически записывать данные в базу. с точкой останова после записать. и попробуй проведи документ новый с датой больше чем дата этого документа. |
|||
216
fisher
04.08.11
✎
18:06
|
(215) У него там без разницы. Там вообще нифига не блокируется, кроме записываемой записи. Никаких диапазонов :)
Там простая запись без ничего и разделение итогов. Можно без проблем по тем же самым измерениям проводить. |
|||
217
5 Элемент
04.08.11
✎
18:07
|
(215) документы новые и количество <> 0
|
|||
218
5 Элемент
04.08.11
✎
18:09
|
(216) убрал разделение итогов - все работает
|
|||
219
Axel2009
04.08.11
✎
18:10
|
теперь что касается базульки
http://narod.ru/disk/20876871001/1Cv8_тест.dt.html качаем. загружаем в скуль базу. создаем док оприходование, подставляем Товар. у меня для вас 3 эксперимента. 1. создаем еще док оприходование, подставляем Товар. ставим бряк на КонецПроцедуры. пытаемся провести док в соседнем сеансе с датой больше чем дата этого документа. ниче не получится. потому что блокировки. удаляем 3ий док если его создали. 2. заходим в SSMS, находим там таблицу для регистров, у меня это _AccumReg6 и _AccumRegTotals9, в общем именно с данными, заходим кластерный индекс каждой из таблиц и переносим поле _Period в самый низ, нафиг он нам сдался наверху, я хочу блочить данные по измерениям. заходим во второй док оприходования с товаром, меняем количество (заставляя 1ску физически перезаписывать). ставим бряк. запускаем вторую сессию и пытаемся провести, о блин.. оно не проводится? почему? ну потому что диапазон регистратора попал так, как нам ну блин ваще никак не надо было :( 3. заходим во 2ой док оприходования, меняем дату так, чтобы она была меньше чем дата 1го. теперь заходим в первый, меняем количество и проводим этот документ. стоим на бряке, в соседнем сеансе проводим документ новый с датой больше чем дата проводимого документа и вуаля, он проводится |
|||
220
Axel2009
04.08.11
✎
18:10
|
(219)+ для каждого 3го документа (нового) подставляем товар2 в поле номенклатура
|
|||
221
5 Элемент
04.08.11
✎
18:17
|
(219) п.1 у меня все проводится
|
|||
222
Axel2009
04.08.11
✎
18:19
|
(216)(217)(218) не знаю каким скулем вы там пользуетесь или какой 1ской, но
http://www.screencast.com/t/ZiNp9GsN прошу прощения за тормоза.. |
|||
223
5 Элемент
04.08.11
✎
18:20
|
||||
224
Axel2009
04.08.11
✎
18:23
|
(223) версия 1с и скуля?
|
|||
225
fisher
04.08.11
✎
18:24
|
(218) Это понятно. Я не к тому. Разделение итогов позволяет просто еще и по тем же значениям измерений писать.
Просто если ты тупо пишешь ничего не читая и не удаляя, то ничего и не блокируется. Но стоит добавить к примеру чтение остатка товара с конструкцией "ДЛЯ ИЗМЕНЕНИЯ" и картина будет другая. |
|||
226
5 Элемент
04.08.11
✎
18:25
|
(224) 8.2.13.219, SQL 2005
|
|||
227
Axel2009
04.08.11
✎
18:29
|
(226) а если оба дока с Товар провести - блокировка будет али как?
|
|||
228
5 Элемент
04.08.11
✎
18:31
|
(227) в этом случае не дает провести
|
|||
229
Axel2009
04.08.11
✎
18:32
|
(228) ну чудес не бывает. заходим в SSMS и смотрим кластерный индекс. по каким полям?
|
|||
230
fisher
04.08.11
✎
18:32
|
(225) Даже не обязательно "ДЛЯ ИЗМЕНЕНИЯ". Просто на разных этапах лочится будет. Либо не даст записать, либо не даст даже прочитать.
|
|||
231
5 Элемент
04.08.11
✎
18:33
|
(229) зачем смотреть? он по всем измерениям
|
|||
232
fisher
04.08.11
✎
18:35
|
(230) + Смысл в том, что лочится будет не только читаемые в запросе данные, а как сиквел на душу положит. Эскалация блокировок сплошь и рядом. Где экстент залочит, а где и таблицу. А управляемые блокировки под контролем полностью.
|
|||
233
Axel2009
04.08.11
✎
18:37
|
(231) смысл во многом. чудес не бывает. если у одного проводится у другого нет на одних и тех же данных, значит чтото в настройках не так
|
|||
234
fisher
04.08.11
✎
18:38
|
(233) У меня проводится тоже (в оригинальном варианте, когда просто запись). SQL2000 (старичок на тестовой машине), 8.2.13.205
|
|||
235
Господин ПЖ
04.08.11
✎
18:40
|
>Смысл в том, что лочится будет не только читаемые в запросе данные, а как сиквел на душу положит.
ерунда... >Эскалация блокировок сплошь и рядом. с чего бы вдруг? >А управляемые блокировки под контролем полностью. под контролем кого? скулю то собственно по барабану |
|||
236
5 Элемент
04.08.11
✎
18:41
|
(233) все-таки нужно показать что "блокируется диапазон от последней записи в регистре до +бесконечность для любых других измерений"
а не такие тесты проводить |
|||
237
Axel2009
04.08.11
✎
19:02
|
эх мне бы доступ к комунибудь.. глянуть что да как..
|
|||
238
Axel2009
04.08.11
✎
19:08
|
||||
239
fisher
04.08.11
✎
19:34
|
Гы! Проводилось, потому что итоги были не рассчитаны.
Рассчитал итоги в этом периоде и болт - в оригинальной базе от пятого элемента не дает параллельно провести два дока по разным товарам (если изменять в них данные, ессно). |
|||
240
Господин ПЖ
04.08.11
✎
19:53
|
(186) кстати работает как надо имхо
НачатьТранзакцию(); Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КурсыВалют"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; ЭлементБлокировки.УстановитьЗначение("Период", НачалоДня(Дата)); ЭлементБлокировки.УстановитьЗначение("Валюта", Вал); Блокировка.Заблокировать(); Сообщить("!"); ЗафиксироватьТранзакцию(); стопорим на сообщить() - форму открывает (shared), а записать не дает - S с X не совместимы |
|||
241
Axel2009
04.08.11
✎
19:55
|
(240) ага, а теперь давай плиз данные по блокировкам скуля. но я уверен их там нет, потому что все выборки идут без хинтов. а уж как у себя 1с сервер разделяет S ли X ли одним им известно, они этой инфой нигде не делились.
|
|||
242
Axel2009
04.08.11
✎
20:00
|
(239) все равно не понятно, почему раньше не работало. для самого регистра тоже есть кластерный индекс, где первое поле Период. тоже самое будет с регистром сведений периодическим, где нет никаких итогов. записывать не будет..
|
|||
243
Господин ПЖ
04.08.11
✎
20:06
|
(241) угу... блокировок нету
|
|||
244
Господин ПЖ
04.08.11
✎
20:09
|
получается что скуль свое прочитал и "пошел дальше", а (240) - чисто работа менеджера блокировок 1С
|
|||
245
Alex_MA
05.08.11
✎
08:03
|
(240)так правильно работает "разделяемая" блокировка.
получается нужно в блоке НачатьТранзакцию() ... ЗафиксироватьТранзакцию() писать разделяемые блокировки |
|||
246
Humandra
05.08.11
✎
08:30
|
А мне вот что интересно... Как 1С в режиме управляемые блокировки работают с версионниками? По идее, проблем с ними должно быть меньше чем с блокировочниками - по крайней мере блокировок при чтении можно не бояться вообще, только при записи, причем только построчной (т.е. при проведении документа тоже никаких блокировок других записей регистра, кроме тех, которые вставляются, удаляются или изменяются).
Но это в теории, а на практике как 1С это сделала? Имеет ли смысл работать предпочительнее с версионниками? |
|||
247
Axel2009
05.08.11
✎
09:00
|
(246) да конечно, 2 документа одновременно делают контроль остатков, оба проходят и в итоге количество уходит в минус. нормально за версионниками следить.
|
|||
248
Vetal_978
05.08.11
✎
09:04
|
(246) (247) А можно пояснить о чем речь?
|
|||
249
Axel2009
05.08.11
✎
09:09
|
(248) зачем?
|
|||
250
Alex_MA
05.08.11
✎
09:20
|
(248)версии объекта в ИБ
|
|||
251
Vetal_978
05.08.11
✎
10:06
|
А SQL тут поддерживает версионирование?
|
|||
252
Axel2009
05.08.11
✎
10:07
|
(251) версионники про которые в (246) это не версионирование объектов.
|
|||
253
Vetal_978
05.08.11
✎
10:08
|
(252) (249) - вот и прошу пояснить
|
|||
254
Axel2009
05.08.11
✎
10:10
|
(253) ну открой в 8.2 запрос к справочнику. там поле есть "Версия" это "порядковый номер" изменения этого объекта. т.е. если перед записью объекта он отличается от значения, которое было при считывании - значит объект изменили с момента считывания
|
|||
255
Alex_MA
05.08.11
✎
10:10
|
(240)кстати провел еще одну отладку:
Документ "РеализацияТоваровУслуг": Исключительная блокировка http://gyazo.com/48da8ec3afad5ac952b69477e628e65b.png Неудачное чтение данных {Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (Прочитать): Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки из-за ожидания сессии 98207 Разделяемая блокировка http://gyazo.com/62988fb1e164b6a8b51ee629b24ab517.png Неудачная запись {Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (Прочитать): Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки из-за ожидания сессии 98207 А в другом сеансе, запускал обработку проверки блокировок, вот ее код: Процедура КнопкаВыполнитьНажатие(Кнопка) Отредактирован = Ложь; НаборЗаписей = РегистрыСведений.РасчетыПоРеализацииОрганизации.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); Попытка НаборЗаписей.Прочитать(); Сообщить("Прочитал ОК", СтатусСообщения.Информация); Исключение Сообщить("Неудачное чтение данных " + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Попытка Если НаборЗаписей.Выбран() Тогда //Пробуем изменить Для Каждого ТекСтр Из НаборЗаписей Цикл ТекСтр.Организация = Значение; Отредактирован = Истина; КонецЦикла; КонецЕсли; Если Отредактирован Тогда НаборЗаписей.Записать(); Сообщить("Записал ОК", СтатусСообщения.Информация); КонецЕсли; Исключение Сообщить("Неудачная запись" + Символы.ПС + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры Получается тут "Разделяемые" блокировки работают и без НачатьТранзакцию()...ЗафиксироватьТранзакцию() |
|||
256
rs_trade
05.08.11
✎
10:13
|
(246) sql 2008 тоже версионником стал
|
|||
257
Axel2009
05.08.11
✎
10:14
|
(256) а что, 2000 не был?
|
|||
258
ДенисЧ
05.08.11
✎
10:14
|
(257) нет
|
|||
259
Axel2009
05.08.11
✎
10:15
|
(258) а если колонку добавить timestamp?
|
|||
260
ДенисЧ
05.08.11
✎
10:16
|
(259) А это не версионник будет... А блокировочник с версией объекта.
|
|||
261
Axel2009
05.08.11
✎
10:17
|
(260) а теперь чтобы быть одинаковыми в понятиях, объясни что такое для тебя
версионник - версионирование - блокировочник с версией объекта - |
|||
262
fisher
05.08.11
✎
10:38
|
Короче, народ. Я не настолько круто шарю в анализе сиквельных блокировок, чтобы давать исчерпывающую оценку работе 1С в штатных ситуациях в этой части (где там бока 1С, а где - издержки механизма блокировок сиквела). Хотя на умняк упасть могу легко - я начитанный.
Но одно несомненно - автоматические блокировки в 1С никоим образом не обеспечивают желаемый уровень параллелизма при проведении (с использованием SERIALIZABLE). И именно это явилось главной причиной введения управляемых блокировок. Управляемые блокировки - именно то, что нужно. На уровне СУБД - READ COMMITTED, а дальше - разруливай сам. |
|||
263
Jolly Roger
05.08.11
✎
10:50
|
(255) видимо, у документа "РеализацияТоваровУслуг" включено автоматическое удаление движений...
|
|||
264
Jolly Roger
05.08.11
✎
10:51
|
(262) спасибо,кэп! чтоб мы без тебя делали...
|
|||
265
ДенисЧ
05.08.11
✎
10:52
|
(261) версионник - на оракл не самый новый посмотри.
|
|||
266
Vetal_978
05.08.11
✎
10:53
|
(265) не конструктивно.
|
|||
267
ДенисЧ
05.08.11
✎
10:53
|
(266) лень расписывать
|
|||
268
Axel2009
05.08.11
✎
10:54
|
(267) нюню
|
|||
269
Alex_MA
05.08.11
✎
11:15
|
||||
270
Humandra
05.08.11
✎
11:21
|
Версионник и блокировочник - жаргонная классификация СУБД,чистых версионников и чистых блокировочников вообще нет, насколько я знаю.
В общих чертах - версионник - это когда в БД хранятся и старые версии значений и новые. А вот как эти версии используются, какие уровни изоляции транзакций как работают - уже везде по разному. Interbase например, насколько я знаю, раньше умела даже одновременную запись без блокировки (с перезатиранием старых данных), что по стандарту, кажется, недопустимо (если не ошибаюсь). Т.е. она была практически чистым версионником - что на самом деле не слишком хорошо при практике. Oracle - блокирует при записи, чтение - неблокирующее. MS SQL - тоже со своими особенностями реализации версионности. ИМХО - идеальный версионник как раз должен себя как Oracle вести - отчеты формировать чтобы было можно как нечто целостное (из версий), а если уж надо заблокировать данные на чтении, например при том же контроле остатков или реализации нумераторов - то это делается явно. |
|||
271
Axel2009
05.08.11
✎
11:27
|
(270) ну тогда в 8.2 версионников нет. потому что там не хранится информация о старых объектах. только сам факт, что версия изменилась.
|
|||
272
Humandra
05.08.11
✎
11:29
|
(271) 8.2 - не СУБД - если не брать файловую БД - поэтому она точно не версионник :)
Но она же может работать с версионниками-СУБД, вот и интересно - насколько у нее это удачно получается. |
|||
273
Axel2009
05.08.11
✎
11:33
|
(272) у нее этого нет, потому что она должна работать не только с 2008 но и даже с 2000
|
|||
274
rs_trade
05.08.11
✎
11:40
|
(273) и даже с ораклом. который версионник изначально.
|
|||
275
Alex_MA
05.08.11
✎
11:43
|
как вы думаете, повысится ли параллельность ?
Модуль объекта "РеализацияТоваровУслуг": Процедура ОбработкаПроведения(Отказ, РежимПроведения) Перем Заголовок, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоТаре; Перем ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам; //{{VSC mas(Begin 05.08.2011 vscУправлениеБлокировкамиОбъектов.УстановитьУправляемыеБлокировкиДокумента(ЭтотОбъект); //End)VSC mas}} ПараметрыПартионногоУчета = глЗначениеПеременной("ПараметрыПартионногоУчета"); ПроводитьПоПартиям = ПараметрыПартионногоУчета.СписыватьПартииПриПроведенииДокументов ИЛИ ПараметрыПартионногоУчета.СписыватьПартииПриПроведенииДокументовБух ИЛИ ПараметрыПартионногоУчета.СписыватьПартииПриПроведенииДокументовНал; ........ Общий модуль: Процедура УстановитьУправляемыеБлокировкиДокумента(ДокументОбъект) Экспорт РежимБлокировки = РежимБлокировкиДанных.Исключительный; Блокировка = Новый БлокировкаДанных(); //ИмяОбъектаПространстваБлокировокДокумент = "Документ." + ДокументОбъект.Метаданные().Имя; ////Блокировка самого документа //ЭлементБлокировки = Блокировка.Добавить(ИмяОбъектаПространстваБлокировокДокумент); //ЭлементБлокировки.Режим = РежимБлокировки; //ЭлементБлокировки.УстановитьЗначение("Ссылка", Источник.Ссылка); КоллекцияДвижений = ДокументОбъект.Метаданные().Движения; Для Каждого ТекРегистрДвижения Из КоллекцияДвижений Цикл ПодчиненностьРегистратору = Ложь; ИмяРегистра = ТекРегистрДвижения.Имя; ТипРегистра = ""; Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "РегистрНакопления"; ПодчиненностьРегистратору = Истина; ИначеЕсли Метаданные.РегистрыСведений.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "РегистрСведений"; Если Метаданные.РегистрыСведений.Найти(ИмяРегистра).РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда ПодчиненностьРегистратору = Истина; КонецЕсли; ИначеЕсли Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистра) <> Неопределено Тогда ТипРегистра = "РегистрБухгалтерии"; ПодчиненностьРегистратору = Истина; КонецЕсли; Если ТипРегистра <> "" Тогда Если ПодчиненностьРегистратору Тогда ЭлементБлокировки = Блокировка.Добавить(ТипРегистра + "." + ИмяРегистра + ".НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировки; ЭлементБлокировки.УстановитьЗначение("Регистратор", ДокументОбъект.Ссылка); КонецЕсли; КонецЕсли; КонецЦикла; //Установка блокировки Попытка Блокировка.Заблокировать(); Исключение ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(), Истина, "Не удалось заблокировать объекты"); ВызватьИсключение "Операция не выполнена"; КонецПопытки; КонецПроцедуры |
|||
276
Jolly Roger
05.08.11
✎
11:56
|
(269) у меня при разделяемой нормально считывается, при исключительной - таймаут.
какая у тебя версия платформы и сервер приложений под какую ось? |
|||
277
Alex_MA
05.08.11
✎
12:04
|
(276)у меня тоже все ок, дело в том, что при открытии формы записи рег.свед. "КурсыВалют" ("Разд.блокировка") выдавало конфликт блокировок. А когда написал как в (240), то стало все Ок. (отличие моего кода от (240), в том, что я не включал блокировку в блок НачатьТранзакцию, ЗафиксироватьТранзакцию)
в (269) написал, что разделяемая блокировка работает Ок, даже если ее не включать в блок НачатьТранзакцию, ЗафиксироватьТранзакцию. |
|||
278
Jolly Roger
05.08.11
✎
12:09
|
(277) а, так это потому что (193)
|
|||
279
MM
05.08.11
✎
12:22
|
(275) Повысится, но будет работать неправильно. Нужны блокировки на остатки, по тем измерениям, которые надо будет менять с проверкой, например, на отрицательность, а в этом коде их нет. Эти блокировки будут ограничивать только проведение одного и того же документа, что не существенно.
1С блокировки имеют совсем другую природу в отличии от блокировок СУБД. |
|||
280
Axel2009
05.08.11
✎
12:25
|
(275) универсальность никогда не была лучшим путем оптимизации
|
|||
281
Alex_MA
05.08.11
✎
12:27
|
(279)т.е. повыситься перепроведение в таком случае ?
|
|||
282
Axel2009
05.08.11
✎
12:29
|
(281) это даст что один док не смогут одновременно проводить 2 пользователя...
|
|||
283
MM
05.08.11
✎
12:36
|
(282) Так ставь одну блокировку на документ, а не на все регистры.
Но эта блокировка не поможет с контролем остатков, они могут выйти в минус. А если ставить по всем измерениям, то наложатся лишние блокировки в документах с чисто плюсовыми движениями (ПКО, Поступление товаров), в которых они ни к чему. |
|||
284
Alex_MA
05.08.11
✎
12:56
|
>>Так ставь одну блокировку на документ, а не на все регистры
Процедура УстановитьУправляемыеБлокировкиДокумента(ДокументОбъект) Экспорт РежимБлокировки = РежимБлокировкиДанных.Исключительный; Блокировка = Новый БлокировкаДанных(); ИмяОбъектаПространстваБлокировокДокумент = "Документ." + ДокументОбъект.Метаданные().Имя; //Блокировка самого документа ЭлементБлокировки = Блокировка.Добавить(ИмяОбъектаПространстваБлокировокДокумент); ЭлементБлокировки.Режим = РежимБлокировки; ЭлементБлокировки.УстановитьЗначение("Ссылка", Источник.Ссылка); Блокировка.Заблокировать(); .... Заблокировали сам документ. Смысл такой блокировки (одного документа) тоже, однако, не велик. Будут проблемы с регистрами. Т.е. как я понял в моем случае надо блокировать не по пространству имен "регистратор", а по измерениям регистров, например "ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов" РежимБлокировки = РежимБлокировкиДанных.Исключительный; Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.НаборЗаписей"); ЭлементБлокировки.Режим = РежимБлокировки; ЭлементБлокировки.УстановитьЗначение("Организция", Источник.Организция); ЭлементБлокировки.УстановитьЗначение("ДоговорКонтрагента", Источник.ДоговорКонтрагента); // //ЭлементБлокировки.УстановитьЗначение("ИмяИзмерения", <ЗначениеИзмерения>); - Вообщем ограничиваем по нашим измерениям, по которым считаем нужным заблокировать // Блокировка.Заблокировать(); Тогда вопрос, как понять по каким измерениям блокировать ? |
|||
285
Alex_MA
05.08.11
✎
13:01
|
(284)глуповатый конечно вопрос :)
|
|||
286
MM
05.08.11
✎
13:13
|
(285) по тем измерениям, которые будут прочитаны с целью проверки остатков, что бы другие проверяющие те же остатки, подождали до конца проведения.
Или лучше воспользоваться новой методикой 8.2 и доверить установку блокировок механизму записи в регистр (БлокироватьДляИзменения), а затем проверить не вышли ли остатки в минус. Партионный учёт (и тд.) следует вынести в отдельный регламентный поток в фоновом задании, там блокировки вообще ни к чему. |
|||
287
MM
05.08.11
✎
13:19
|
(284) и не имеет смысла блокировать движения документа РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.НаборЗаписей, надо блокировать РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов остатки, поскольку именно за них ведётся конкуренция из разных сессий.
|
|||
288
Alex_MA
05.08.11
✎
13:26
|
(287)так, а как заблокировать егистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки ?
Я уже начинаю недопонимать. Нет такого пространства блокировок "Остатки" И еще по (283), как они могут уйти в минус - тоже недопонимаю |
|||
289
Axel2009
05.08.11
✎
13:29
|
(288) ну попробуй заблочить по регистратору списание и поставь бряк. после этого проведи еще одно списание, чтобы остаток ушел в минус
|
|||
290
Alex_MA
05.08.11
✎
13:32
|
(289)как они уйдут в минус, если я использую "Исключительную" блокировку по тем регистрам, в которые пишу ?
|
|||
291
MM
05.08.11
✎
13:37
|
(290) блокировка не по регистру, а по набору записей и набор записей тебе действительно менять не дадут, а вот остатки пожалуйста.
Для пространства РегистрНакопления.<имя> - Период, <имя измерения> Период нам не нужен. Код в (284) не верный:
|
|||
292
5 Элемент
05.08.11
✎
13:43
|
В 8.1 был хороший файлик AddDoc/RU/V8AddDoc81.htm
почитай в нем раздел "Управляемые блокировки 1С:Предприятия 8.1" |
|||
293
Alex_MA
05.08.11
✎
13:48
|
(291)>>Для пространства РегистрНакопления.<имя>.НаборЗаписей - Регистратор; это как ?
вот так: ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.НаборЗаписей.Регистратор"); (292)ушел читать |
|||
294
Alex_MA
05.08.11
✎
13:51
|
(291)кажется понял
|
|||
295
Alex_MA
05.08.11
✎
15:02
|
(289)ты имеешь в виду такой пример:
ОстатокНаСкладе = 10 шт.; Проводим Списание №1 (7 шт.) в отладчике, ставим ставим бряк на последней строчке проведения, когда вся логика проведения сделана, но транзакция не зафиксировалась. Стоим, ждем. Проводим Списание №2 (8 шт.). Провели. И в отладчике "жамкаем" F5, допроведение и фиксация транзакции. В результате -15. Так ? |
|||
296
Axel2009
05.08.11
✎
15:05
|
в результате -5 конечно.. но да
|
|||
297
Alex_MA
05.08.11
✎
15:09
|
(296)конечно же -5
|
|||
298
Humandra
05.08.11
✎
16:19
|
Тут все упирается в то, что есть гипотеза, что нужен контроль отрицательных остатков. Часто он не нужен по специфике предметки или разгильдяйству заказчика :)
|
|||
299
Axel2009
05.08.11
✎
16:20
|
(298) когда сидит 20 операторов и постоянно забивают заказы, тут как бы без него сложно
|
|||
300
ptiz
05.08.11
✎
16:26
|
300
|
|||
301
Alex_MA
08.08.11
✎
08:58
|
(291)вот в процедуре, которая находится в обработке проведения
Процедура ОтражениеЗадолженностиВРегистреОперативныхРасчетовПоДокументам(СтруктураШапкиДокумента, ТаблицаВзаиморасчетов, ВидРасчетовСКонтрагентом, ВидДвижения, Движения, Отказ, Заголовок) Экспорт есть запрос: "ВЫБРАТЬ | ВзаиморасчетыПоДокументамОстатки.Организация, | ВзаиморасчетыПоДокументамОстатки.Контрагент, | ВзаиморасчетыПоДокументамОстатки.ДоговорКонтрагента, | ВзаиморасчетыПоДокументамОстатки.Сделка, | ВзаиморасчетыПоДокументамОстатки.ДокументРасчетовСКонтрагентом, | ВзаиморасчетыПоДокументамОстатки.ВидРасчетовСКонтрагентом, | ВзаиморасчетыПоДокументамОстатки.УпрУчет, | ВзаиморасчетыПоДокументамОстатки.СуммаВзаиморасчетовОстаток * &ЗнакОстатка КАК СуммаВзаиморасчетов, | ВзаиморасчетыПоДокументамОстатки.СуммаРеглОстаток * &ЗнакОстатка КАК СуммаРегл |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки( | , | Организация = &Организация | И Контрагент = &Контрагент | И ДоговорКонтрагента = &ДоговорКонтрагента | И ВидРасчетовСКонтрагентом = &ВидРасчетовСКонтрагентом | И УпрУчет = &УпрУчет | И (Сделка, ДокументРасчетовСКонтрагентом) В (ВЫБРАТЬ Сделка, ДокументРасчетовСКонтрагентом ИЗ ТаблицаВзаиморасчетов)) КАК ВзаиморасчетыПоДокументамОстатки |ГДЕ | ВзаиморасчетыПоДокументамОстатки.СуммаВзаиморасчетовОстаток * &ЗнакОстатка > 0"; Запрос.УстановитьПараметр("Организация", Организация); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента); Запрос.УстановитьПараметр("ВидРасчетовСКонтрагентом", ВидРасчетовСКонтрагентом); Запрос.УстановитьПараметр("УпрУчет", УпрУчет); Запрос.УстановитьПараметр("ЗнакОстатка",ЗнакОстатка); ОстаткиПоРасчетам = Запрос.Выполнить().Выгрузить(); Зачем тут еще блокировать ? Ведь ИМХО и так заблокируются только записи по параметрам ? |
|||
302
Alex_MA
08.08.11
✎
10:08
|
ап?
|
|||
303
fisher
08.08.11
✎
10:09
|
(301) В режиме автоматических блокировок - заблокировались бы от изменения прочитанные данные плюс еще лишак.
А в режиме управляемых блокировок этот запрос ничего не блокирует. Обеспечивается только адекватность прочитанных данных (чтение не "грязное"). Т.е. параллельная транзакция может как читать, так и менять эти данные. Всё рулится только через управляемые блокировки. |
|||
304
Alex_MA
08.08.11
✎
10:28
|
(303)тогда нужно так блокировать?
//РезультатЗапросаРеквизитовОбъекта - результат запроса к реквизитам объекта (ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка) Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыПоДокументамРасчетов"); ЭлементБлокировки.ИсточникДанных = РезультатЗапросаРеквизитовОбъекта; ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("Организация", "Организация"); ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("Контрагент", "Контрагент"); ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("ДоговорКонтрагента", "ДоговорКонтрагента"); ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("УпрУчет", "УпрУчет"); ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("Сделка", "Сделка"); Блокировка.Заблокировать(); |
|||
305
Alex_MA
08.08.11
✎
10:28
|
(304)+Так увеличится || ?
|
|||
306
Alex_MA
08.08.11
✎
10:30
|
(304)+Блокируем Исключительной блокировкой
|
|||
307
Axel2009
08.08.11
✎
10:31
|
(304) помоему проще заблочить договор контрагента и не париться. вдруг где что как будет использоваться сделка, которая по фифо списывается например
|
|||
308
Alex_MA
08.08.11
✎
10:31
|
(303)еще интересно в режиме автоматических блокировок, что будет за "лишак" ?
|
|||
309
Alex_MA
08.08.11
✎
10:35
|
(307)если мы укажем только договор, тогда диапазон блокировки ведь будет шире и || меньше ?
|
|||
310
Axel2009
08.08.11
✎
10:50
|
(308) блокируется диапазон между изменяемыми данными. принцип блокировочника, чтобы не было фантомов (читай на мсдн про них)
(309) || меньше, но у вас что по 3му контрагенту 150 сотрудников вводят данные? |
|||
311
Alex_MA
08.08.11
✎
10:51
|
при переводе на упр. блокировки:
http://gyazo.com/60ca7a2ebfd08a09856b3103173532c9.png это однозначно Исключительная блокировка |
|||
312
Axel2009
08.08.11
✎
10:54
|
(311) вопрос в чем?
|
|||
313
Alex_MA
08.08.11
✎
10:56
|
(312)убедитсья :), я ведь еще только начал разбираться в упр. блокировках. Иду неуверенным шагом по "тонкому льду"
|
|||
314
Alex_MA
08.08.11
✎
11:00
|
В "мануале" написано, что все регистры, по которым делаются движения должны быть переведены в Упр.режим. Однако, это ведь не обязательно, следующая схема ведь будет работать корректно:
//Документ который проводится переведен в пр. блокировки Процедура ОбработкаПроведения(Отказ) ДвижениеПоВзаиморасчетыСКонтрагентами (ВзаиморасчетыСКонтрагентами - Упр.блокировкой данных = Управл., следовательно будет наложена управляемая блокировка) ДвижениеПоРасчетамСКонтрагентами (РасчетамСКонтрагентами - Упр.блокировкой данных = Автом., следовательно будет наложена автом. блокировка) КонецПроцедуры; "ВзаиморасчетыСКонтрагентами" заблокируется при помощи Упр. блокировки, а "РасчетамСКонтрагентами" - автомат. блокировки. Все так ? |
|||
315
5 Элемент
08.08.11
✎
11:02
|
(311) с чего это там должна быть исключительная блокировка?
Ты все так и будешь гадать на кофейной гуще? |
|||
316
Axel2009
08.08.11
✎
11:02
|
(314) насколько помню в данном случае в какой-то момент идет ругательство, что виды блокировок различаются у объектов..
|
|||
317
5 Элемент
08.08.11
✎
11:03
|
(314) в один момент времени либо УБ либо АБ.
|
|||
318
Alex_MA
08.08.11
✎
11:09
|
(517)на ИТС написано, что Исключительный - для тех данных, которые должны быть изменены в рамках этой же транзакции. А эти регистры, однозначно меняются
|
|||
319
5 Элемент
08.08.11
✎
11:29
|
(318) Ты плохо читал. Исключительная ставится если данные сначала читаются, а потом изменяются.
|
|||
320
Alex_MA
08.08.11
✎
12:00
|
Странно, у документа "реализацияТоваровУслуг" режим управления блокировками данных = Упр., а у регистра "Продажи" - автоматический. При проведении документа ошибок никаких не было
|
|||
321
Alex_MA
08.08.11
✎
12:01
|
(320)У конфигурации = Управляемый - наверно из за этого
|
|||
322
fisher
08.08.11
✎
12:04
|
(308) Смысл уровня изоляции SERIALIZABLE состоит в том, чтобы блокировать не только прочитанные записи, но и дополнительные записи, чтение/изменение которых может привести к появлению фантомов. Сиквел не знает особенностей учетной системы и не в состоянии сообразить заблокировать только те дополнительные записи, которые реально критичны в этой ситуации. Поэтому реализовано это блокированием записей по диапазону ключа того индекса, который используется при чтении. Чаще всего это кластерный индекс. Очевидно же, что сплошь и рядом будет блокироваться лишак (ситуаций много, а индекс один, и даже если чётко в индекс - блокироваться будет ВЕСЬ диапазон, а не минимально необходимые поддиапазоны). Плюс эскалация транзакций. Увидит сиквел, что на какую-то страницу приходится много блокировок - заблокирует всю страницу. Отработка большого количества блокировок снижает производительность.
(314) Обязательно. Смешанную схему в рамках одной транзакции использовать не получится. Если инициирована транзакция с управляемыми блокировками, попытка использования в её рамках автоматических блокировок приведет к ошибке исполнения. (321) Нет. Дело в чем-то другом. Либо продажи не двигались, либо всё прошло в автоматическом режиме. Там какие-то ньюансы были по определению режима блокировок транзакции... Надо обратиться к первоисточникам :) |
|||
323
fisher
08.08.11
✎
12:07
|
(322) + речь не только о существующих записях, но и о диапазонах, в которые могут быть вставлены новые записи.
|
|||
324
5 Элемент
08.08.11
✎
12:10
|
(322) Диапазон блокируется не просто так. Нельзя говорить, что это "лишак".
|
|||
325
Reset
08.08.11
✎
12:14
|
(321) лол, естеественно из-за этого. В этом режиме установки у объектов игнорируются
|
|||
326
Alex_MA
08.08.11
✎
12:15
|
(322)по(321)все таки так. Изменил у конфигурации = Автоматический и Управляемый, вышла ошибка:
http://gyazo.com/93c5889d9d81f6c3f51bb1fd72a01018.png У нас сейчас конфа стоит в управляемом режиме, а упр. блокировки нигде не описаны, получается мы имеем целую кучу проблем которые могут происходить при REPERABLE READ и SIZEREABLE |
|||
327
Alex_MA
08.08.11
✎
12:15
|
(325)да, уже разобрался
|
|||
328
Alex_MA
08.08.11
✎
12:26
|
а если написать вместо как (304):
//РезультатЗапросаРеквизитовОбъекта - результат запроса к реквизитам объекта (ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка) Блокировка = Новый БлокировкаДанных(); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыПоДокументамРасчетов"); ЭлементБлокировки.ИсточникДанных = РезультатЗапросаРеквизитовОбъекта; ЭлементБлокировки.ИспрользоватьИзИсточникаДаннх("Организация, Контрагент, ДоговорКонтрагента, УпрУчет, Сделка", "Организация, Контрагент, ДоговорКонтрагента, УпрУчет, Сделка"); Блокировка.Заблокировать(); || еще увеличится, т.к. происходит уменьшение диапазона, в отличии от (304). В (304) блокировка похожа на "ОБЪЕДИНИТЬ", т.е. взяли поле Склад = нашему значению, заблокировали, к этим записям добавили записи по "ДоговорКонтрагента" - заблокировали, добавили "Сделка" - заблокровали и т.д. |
|||
329
Alex_MA
08.08.11
✎
12:28
|
(328)такого описания нигде не увидел, кроме как на одном из оф.форумов 1С. В СП в данном случае такого намека даже нет
|
|||
330
fisher
08.08.11
✎
12:48
|
(324) Блокируется ИЗБЫТОЧНЫЙ диапазон. Т.е. + лишак.
|
|||
331
fisher
08.08.11
✎
12:49
|
(325) Блин, точно. Оно только в совместном проверяется...
|
|||
332
5 Элемент
08.08.11
✎
12:57
|
(330) мне было бы интересно разобрать этот вопрос.
Можешь привести пример? |
|||
333
Axel2009
08.08.11
✎
13:00
|
(330) кроме как эскалации блокировок что еще?
|
|||
334
5 Элемент
08.08.11
✎
13:04
|
(333) Диапазон ключей - см http://technet.microsoft.com/ru-ru/library/ms175519(SQL.100).aspx
|
|||
335
5 Элемент
08.08.11
✎
13:11
|
(330) честно скажу, что этот вопрос не очень понятен. буду благодарен если поделишься информацией.
А пока сам почитаю, подумаю :) Что написано про эту блокировку: "один и тот же запрос должен возвращать одинаковые результаты при каждом выполнении в одной транзакции. В запросе просмотра диапазона новые строки не должны вставляться другими транзакциями, иначе они окажутся фиктивными вставками".
Из этого следует, что эта блокировка не "лишак", т.к. она решает востребованную проблему. |
|||
336
Axel2009
08.08.11
✎
13:24
|
(334) диапазон я бы лишаком не назвал. про них я знаю
|
|||
337
fisher
08.08.11
✎
16:51
|
(332),(333),(335) На самом деле, я не настоящий сварщик. Разбирать и интерпретировать конкретные ситуации тут не так просто. Например, у меня не получается в режиме автоматических блокировок провести одновременно два дока, пишуших по разным измерениям конкретного регистра. Но выяснить, почему конкретно так получается - знаний не хватает. Как, например, интерпретировать шестибайтовый идентификатор ресурса из результатов SP_LOCK для блокировок типа KEY (диапазон индекса)? Как понять, какой конкретно диапазон под этим скрывается?
Но, блин, даже в идеальной ситуации по учебнику, когда в запросе есть красивенькое условие идеально попадающее в индекс - даже тогда существуют серьезные издержки, описанные в тех же учебниках (связанные с тем, что границами диапазона блокировки могут выступать только физически существующие записи или плюс/минус бесконечность). А если условия отличны от идеальных? Куда не ткнись - говорится о том, что механизм блокировок по ключу при SERIALIZABLE несовершенен, но заведомо лучше табличных блокировок (какими обеспечивался SERIALIZABLE в MSSQL до выхода MSSQL 7.0). |
|||
338
fisher
08.08.11
✎
17:04
|
(337) + Информация в MSDN поражает полнотой:
Resource - Значение, определяющее блокируемый ресурс. Формат значения зависит от типа ресурса определяемого в столбце Type. Для KEY это - "шестнадцатеричное число, используемое компонентом Database Engine для внутренних целей". Ахренеть! |
|||
339
Axel2009
08.08.11
✎
17:05
|
(338) я все находил, там вроде конкретная строка индекса указывается. в общем инфа есть в инете, но я не на мсдне искал..
|
|||
340
fisher
08.08.11
✎
17:07
|
(339) Какая, нафиг, строка? Там диапазон должен быть! И те значения, которые я там вижу, не совпадают ни с одним полем из индекса.
|
|||
341
Axel2009
08.08.11
✎
17:29
|
(340) диапазон из количества строк складывается
KEY <hash_value> Представляет хэш ключевых столбцов из строки, представляемой данным ресурсом. |
|||
342
fisher
08.08.11
✎
18:18
|
(341) KEY - это диапазон. Одна строка - это не диапазон. А вообще - пруфлинк, плиз.
|
|||
343
Axel2009
08.08.11
✎
19:46
|
||||
344
Axel2009
08.08.11
✎
19:51
|
(343) вот вешаемая блокировка на регистр накопления
resource_type resource_description resource_associated_entity_id request_mode ------------- ------------------------- ----------------------------- ------------ KEY (ffffffffffff) 72057594057326592 RangeS-S PAGE 1:315 72057594057326592 IX KEY (7e02100a6239) 72057594057326592 RangeX-X KEY (8702b1877161) 72057594057326592 RangeS-S |
|||
345
fisher
09.08.11
✎
10:22
|
Что-то ничего не прояснилось. Как из этой информации выцепить реально блокируемый диапазон?
|
|||
346
Axel2009
09.08.11
✎
10:34
|
от (8702b1877161) RangeS-S
до (ffffffffffff) RangeS-S |
|||
347
GoldenDawn
09.08.11
✎
11:48
|
проблемы эти с блокировками возникают потому что между чтением и записью возникает необыкновенной красоты алгоритм расчета чего-то там который и подвешивает систему
но всем пофик, управляемые блокировки позволяют удовлетворить чсв бородатых задротов и повысить из незаменимость и баблоёмкость разаработки |
|||
348
fisher
09.08.11
✎
11:59
|
(346) Да ну? А под KEY (7e02100a6239) RangeX-X тогда какой диапазон скрывается? И каким образом системой используется этот хэш ключевых стобцов? С ним же ничего толком сделать нельзя. Только сравнить на равенство, вычислив аналогичный для какой-то строки индекса. Или он изначально хранится в индексе, являясь по сути его ключевым полем? В общем, как зная его, получить конкретную строку индекса? Лично мне.
(347) Частично соглашусь. Оптимизация алгоритмов проведения гораздо более перспективное направление повышения пропускной способности системы в большинстве случаев. |
|||
349
Axel2009
09.08.11
✎
13:23
|
(347) да прально, нужно нанять кучу гастарбайтеров, которые будут минуса выверять.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |