Имя: Пароль:
1C
1С v8
Опять про управляемые блокировки
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
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) вот это
а так же, чтобы внутри "Автоматической блокировки" не было "Управляемой"

3.В обработке проведения блокируем "Исключительной" те данные которые будут изменены.

4."Разделяемой" те регистры, на основании анализа которых выполняется определенная логика проведения этого документа. (Т.е. те регистры, из которых мы просто получаем информацию, записывать туда не будем).
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) не верный:

ЭлементБлокировкиДанных (DataLockItem)
УстановитьЗначение (SetValue)
Синтаксис:
УстановитьЗначение(<ПолеПространстваБлокировок>, <БлокируемоеЗначение>)
Параметры:
<ПолеПространстваБлокировок> (обязательный)
Тип: Строка. Имя поля пространства блокировки. Поддерживаются следующие имена полей:
...
Для пространства РегистрНакопления.<имя>.НаборЗаписей - Регистратор;
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) да прально, нужно нанять кучу гастарбайтеров, которые будут минуса выверять.
Независимо от того, куда вы едете — это в гору и против ветра!