|
Опять про управляемые блокировки | ☑ | ||
---|---|---|---|---|
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) не верный:
|
|||
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) да прально, нужно нанять кучу гастарбайтеров, которые будут минуса выверять.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |