Имя: Пароль:
1C
1С v8
Опять про управляемые блокировки
,
0 Alex_MA
 
03.08.11
14:52
Все доброго дня уважаемые коллеги!

Есть определенные правила:

1.Проблема повторного изменения. (Нельзя одновременно изменять одни и те же данные)
2.Проблема "грязного" чтения. (нельзя читать уже измененные, но еще не записанные данные)
3.Проблема неповторяемого чтения. (Нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений)
4.Фантомы. (Нельзя вводить новые данные (удалять имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении)

Все вроде понятно. А как реализовать ?

Сеанс №1(Пользователь Петров): Вот, например, возьмем п.2. Например мы изменяем записи во "ВзаиморасчетыСКонтрагентами" (имя пространства блокировок "Ссылка", т.е. по конкретному регистратору).

Сеанс №2(Пользователь Иванов): Хочет получить в какой то процедуре обороты по регистру "ВзаиморасчетыСКонтрагентами". - Выходит, при таком стечении обстоятельств надо блокировать всю таблицу "ВзаиморасчетыСКонтрагентами", т.к. Сеанс №2 может получить не правильные данные ? исключительная блокировка ?
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) да прально, нужно нанять кучу гастарбайтеров, которые будут минуса выверять.
Закон Брукера: Даже маленькая практика стоит большой теории.