|
Запутался с БлокироватьДляИзменения | ☑ | ||
---|---|---|---|---|
0
john_ddd
04.09.12
✎
18:14
|
Когда можно или нужно использовать БлокироватьДляИзменения,
а когда Блокировка = Новый БлокировкаДанных? |
|||
1
sanja26
04.09.12
✎
18:37
|
сходи на курсы в 1с
|
|||
2
john_ddd
05.09.12
✎
09:51
|
ап
|
|||
3
Maxus43
05.09.12
✎
09:52
|
БлокироватьДляИзменения - в рамках транзакции.
Блокировка = Новый БлокировкаДанных - управляемые блокировки |
|||
4
john_ddd
05.09.12
✎
09:58
|
(3)так Блокировка = Новый БлокировкаДанных тоже в рамках транзакции действует.
|
|||
5
Maxus43
05.09.12
✎
10:00
|
БлокироватьДляИзменения = "ДЛЯ ИЗМЕНЕНИЯ" в запросе?
|
|||
6
john_ddd
05.09.12
✎
10:03
|
(5)думаешь равно?
|
|||
7
Maxus43
05.09.12
✎
10:05
|
(6) я спрашиваю.
Короче я имел ввиду что "ДЛЯ ИЗМЕНЕНИЯ" - это в рамках транзакции, в автоматическом режиме. БлокироватьДляИзменения, Блокировка = Новый БлокировкаДанных - это управляемые блокировки. БлокироватьДляИзменения: Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных.(с) |
|||
8
john_ddd
05.09.12
✎
10:22
|
(7)спасибо. вроде начинаю догонять)
|
|||
9
ssh2006
05.09.12
✎
10:32
|
(5) нет. в упр режиме надо накладывать упр блокировку Новый БлокировкаДанных.
|
|||
10
john_ddd
05.09.12
✎
10:45
|
(9)БлокироватьДляИзменения - это тоже упр режим. Иначе выдает ошибку
|
|||
11
sanja26
05.09.12
✎
11:08
|
(10) не будет работать на управляемых блокировках твоя БлокироватьДляИзменения
|
|||
12
john_ddd
05.09.12
✎
11:14
|
(11)будет как написано в (6)
БлокироватьДляИзменения: Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. |
|||
13
sanja26
05.09.12
✎
11:17
|
оставайся при своем, твое дело
БлокироватьДляИзменения для автоматических блокировок |
|||
14
ssh2006
05.09.12
✎
11:58
|
(10) [БлокироватьДляИзменения - это тоже упр режим. Иначе выдает ошибку]
На это и не было возражений. 1) Автоматический режим. Конструкция в запросе ДЛЯ ИЗМЕНЕНИЯ позволяет наложить исключительную блокировку до конца транзакции на данные, которые планируется в ней же изменить. Такой же запрос в другом сеансе не сможет начать чтение, пока транзакция не закончится. Дедлока не возникнет. 2) Упр режим. Конструкция ДЛЯ ИЗМЕНЕНИЯ не работает. Вместо этого руками нужно накладывать исключительную блокировку Новый БлокировкаДанных. 3) Упр режим. БлокироватьДляИзменения - "свойство БлокироватьДляИзменения заменяет явный вызов блокировки из языка, если заблокировать нужно именно все комбинации, которые есть в наборе записей". Т.е. с момента записи и до конца транзакции будет наложена исключительная блокировка - блокируются все записи с уникальной комбинацией значений "Период + измерения...". Необходимо это тогда, когда Вам важно гарантировать неизменность итогов до конца транзакции. Например - проверка остатков после записи. Суть в том, что если не использовать это свойство, то блокировка в любом случае будет наложена системой, однако, если в регистре включено разделение итогов, то параллельно может быть записан набор с такими-же измерениям и итоги изменятся. А при использовании этого свойства блокировка происходит без учета разделителя итогов. Также, при использовании метода Заблокировать() режим разделения в данном регистре игнорируется. 4) Когда пишется "пустой" набор, то: блокируются данные по "очищаемым" записям; записи очищаются |
|||
15
john_ddd
05.09.12
✎
14:57
|
(14)полезная информация. еще раз спасибо)
|
|||
16
ssh2006
06.09.12
✎
18:03
|
+(14) В книге знаний есть статья про конструкцию ДЛЯ ИЗМЕНЕНИЯ
Книга знаний: v8: Ключевое слово ДЛЯ ИЗМЕНЕНИЯ Однако там неверно описана проблемная ситуация: "Рассмотрим многопользовательский режим работы: Процесс А: Начинает транзакцию. Считывает остатки (допустим получилось 10) Процесс Б: Начинает транзакцию. Считывает остатки (получилось 10) Процесс А: Контролирует остатки, выполняет расчеты (допустим, нужно списать 8), Процесс А: Выполняет запись новых данных (10-8 = 2). Завершает транзакцию. Процесс Б: Контролирует остатки (10 > 7), думает, что все ок. Выполняет расчеты (допустим, нужно списать 7) Процесс Б: ОШИБКА: Он не может списать 7, поскольку в регистре уже не хватает остатка (там уже 2) после записи движений процессом А или после записи движений на складе образуется минус." -------------------------------- В автоматическом режиме такой ситуации в принципе возникнуть не может: процесс А не сможет выполнить запись измененных данных, т.к. на эти данные уже наложена разделяемая блокировка в результате их чтения процессом Б. В этой ситуации возникнет взаимоблокировка - процессы будут ждать окончания друг друга и чтобы этого избежать используется ДЛЯ ИЗМЕНЕНИЯ, блокирующее считанные данные от чтения запросами с этой конструкцией в других транзакциях. Описанная ситуация может возникнуть в режиме упр блокировок. Т.к. в этом режиме разделяемая блокировка, возикающая при выполнении запроса, снимается после выполнения запроса и данные смогут быть изменены процессом Б. Чтобы этого избежать нужно перед чтением наложить управляемую блокировку. Если блокировку сделать разделяемой, то может возникнуть взаимоблокировка как в описанном выше случае с запросом без конструкции ДЛЯ ИЗМЕНЕНИЯ. Поэтому нужно накладывать в этом случае исключительную блокировку. "Можно сказать, что исключительная управляемая блокировка является средством борьбы с конфликтами блокировок (deadlock) и может использоваться аналогично ключевому слову ДЛЯ ИЗМЕНЕНИЯ языка запросов в режиме автоматических блокировок." |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |