powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Блокировки, транзакции и "непротиворечивое чтение"
15 сообщений из 15, страница 1 из 1
Блокировки, транзакции и "непротиворечивое чтение"
    #36661695
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть большая глобаль вида
^V(код объекта, код параметра, время)=значение.
В нее постоянно сыплются данные и из нее формируются отчеты.
Ввод данных идет по нескольку строк (4 и больше) в одной транзакции - исходный показатель плюс пересчет производных(зависимых) показателей.
Отчеты содержат по несколько сотен показателей на определенное время.

Насколько я понимаю, мне придется использовать для отчетов разделяемую блокировку вроде
lock ^V#"S":10
а для записи эксклюзивную вроде
lock ^V:10

Очень не нравится, что приходится блокировать глобаль целиком, но другого способа получить в отчете непротиворечивые данные я не вижу.

С другой стороны, если блокировать каждый показатель в отдельности
lock +^V(код объекта, код параметра, время)
по мере обращения к ним при вводе и при формировании отчета, я непременно нарвусь на дедлок.

Как решаете такие проблемы, коллеги?
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36661768
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю, у вас значения старых данных сохраняются в истории, а изменения идут путем дозаписи новых величин не изменяя старые?

Тогда зачем блокировка для отчета? Делайте сбор данных на определенный момент времени - они будут непротиворечивы.
А просто если вы прямым перебором глобала будете делать отчет, то у вас данные будут сомнительными даже в случае непротиворечивости чтения и записи отдельных параметров - для объектов с маленькими кодами они всегда будут более старыми, чем для объектов с большими(по сортировке) кодами.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36661779
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR , не совсем понятна твоя проблема... Ведь у тебя есть третий параметр "время". Т.о. можно делать отчет на некое время.
Или данные вносятся "задним числом"?
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36662853
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR,

Есть подобная необходимость. Решаем так:
- запись исключительно через объекты (структура хранения дефолтная, записывается единовременно от 1 до 30 объектов)
- чтение через SQL
А они уж между собой как-то умудряются разбираться. Я об этом не задумываюсь.
В табличке 84 млн. записей. Работает она больше года. Т.е. в день примерно 200-300 тысяч записей валится. Сейчас думаю больше, чем год назад... Отчеты строятся тоже постоянно - не раз в минуту, так раз в 10 минут.
Проблем не наблюдали.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36663057
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н., krvsa
...я так понимаю, у вас значения старых данных сохраняются в истории, а изменения идут путем дозаписи новых величин не изменяя старые?

Нет, время это вполне конкретное, либо граница суток, либо 2-х часов, и изменение значения показателя на это время заменяет предыдущее.
Я думал насчет использования дополнительного индекса, назовем его N, который содержал бы порядковый номер обращения к глобали, неважно, на запись или чтение. Тогда можно было бы выбирать в отчет записи, у которых N меньше, чем N запроса. В этом случае можно вообще не блокировать глобаль.
Смущает меня то, что производные показатели верхнего уровня (по цеху, предприятию) зависят от тысяч исходных показателей на технологических объектах, т.е. пересчитываются при вводе каждого i-го исходного показателя. Они будут иметь тысячи версий значений по N(i).
Выигрываем в отсутствии блокировок, проигрываем в увеличении размера базы, некотором усложнении программы.
Каждые 2 часа приходит 2-3 тысячи исходных значений, половина с телемеханики, вторая половина ручной ввод. Рассчитывается до 1тыс производных показателей, 90% которых имеет 2-5 исходных, 10% - от 100 до 2000. Двухчасовые сводки смотрят до 30 пользователей, суточные сводки поутру смотрят примерно 100 пользователей.
Считаете есть смысл вводить версионность значений, чтобы уйти от блокировок?

kolesov
...структура хранения дефолтная, записывается единовременно от 1 до 30 объектов.

По моему, если транзакция обновляет больше одной записи, то не обойтись без блокировок. Иначе отчет может выбрать одну запись до отработки транзакции, а другую после. И, если их значения между собой как-то связаны, мы получим в отчете противоречивые данные.
Видимо, объекты и SQL как-то используют блокировки.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36663656
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DirksDRВидимо, объекты и SQL как-то используют блокировки.
AboutConcurrency
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36663803
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRСчитаете есть смысл вводить версионность значений, чтобы уйти от блокировок?
Для начала лучше подробнее узнать о структуре хранения данных и что там что... А так, показал нам один глобал... Поля назвал... И понимай как хочешь.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36663835
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм
1
По идее хорошо бы блокировать при изменении "объект". Но так как они у вас взаимосвзяанные и имеют смысл только все в совокупности, то при изменении одного параметра нужно блокировать всю ветку "объектов" до тех пор, пока изменение не будет проведено.
Причем, по-видимому придется это делать в транзакции. Здесь минусы в том, что постоянно система будет находиться в процессе установления или снятия блокировок - это будет основное время ее работы. Если натыкаемся на перекрестные блокировки, то откатываем все, ждем и делаем сначала.

Отчет будет проходить по "объектам", ставя на каждом шаред-блокировку. Если натыкается на эксклюзив блокировку, то стоит и ждет, пока она не снимется эксклюзив-блокировка.

Минус - замедление работы отчета и внесения изменений из-за работы с блокировками.

2. Блокируем всю систему(глобал) и работаем по очереди.
Рабочий процесс будет быстрее, но число одновременно работающих процессов будет меньше.

3. Версионность
Че-то мне этот путь не нравится. Так как у вас имеет смысл ветка значений, то версии нужно создавать для всей ветки. Проблемы даже страшно представить

Я склоняюсь к первому варианту.
под объектом я понимаю некоторую сущность, связанный набор параметров.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36663844
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и имейте ввиду, что имя блокировки никакого отношения к самому глобалу не имеет
Уж не знаю по какой традиции оно обычно делается таким же, как и глобал.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36664703
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.,

Спасибо, беру таймоут, надо обмозговать это дело.
Попробую вариант 2 как самый простой.
Почитаю про версионность.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36665275
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRОтчеты содержат по несколько сотен показателей на определенное время.


Ну если исходить из предположения что параметры у вас меняются с нарастающим временем, то всё что вам нужно - это узнать в какой момент времени закончилась транзакция и следовательно изменение данных.

Тогда отчету дается это время и он не выбирает данные раньше него.

В принципе можно решить это добавив в перед и/или после завершением транзакции в процедуре записи параметров, что то вроде
Код: plaintext
1.
set ^CacheTempJobTSActiviti($JOB,$TL)=$H

Таким образом будете знать - в какой последний момент $TL был равен 0-ю, и выбирать до него - ну там с погрешностью какой то - вместо $H использовать $ZH там миллисекунды...

ЗЫ: это если я правильно задачу понял
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36665623
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR,
У нас похожая обработка данных. Используем такой механизм. Все данные приходят какими-то порциями назовем шапка. У шапки есть признак целиком ли обработана порция. Соответственно в выборках берем только данные из порций целиком обработаных. В Cache' реализовать проще простого через SQL.
class PortionOfData {
Property saveDate As %TimeStamp;
Property deleteFlag As %Integer [InitialExpression=2];
}

class PortionRow {
Property .....
Preperty portionOfDataItem As PortionOfData [Reqiured];
}

SELECT * FROM PortionRow WHERE PortionOfDataItem->deleteFlag = 0

Дополнительно стоят индексы на deletFlag и portionItem

Сейчас в таблице около 120 млн записей, за последние полгода. Результат отбора около .5 мс.
От прямого перебора глобалов отказались давно, т.к. при SQL Cache' автоматически использует пересечения индексов и построение оптимального плана выборки.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36666718
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ptn,

Ваше предложение, особенно в части анализа завершенности транзакций, напоминает версионность данных в базе, как она описана по ссылке:
http://www.ibase.ru/devinfo/versions.htm
Дата и время в моей таблице
^V(код объекта, код параметра, время)=значение
это не время сохранения значения в базе, а время замера. Например, значение параметра на 14 часов может прийти в 14ч15мин. А может диспетчер ввести его в конце смены.
Мне нравится идея версионности, но делать на прикладном уровне то, что в Oracle или InterBase встроено в систему... Но не исключено, что попробую.

=Dimon=

Вы похоже на прикладном уровне реализуете транзакции? Поле deleteFlag видимо сбрасывается в 0 после того, как вся порция записана в таблицу?
Здесь выше kolesov пишет, что это излишне, если Вы работаете через объекты и SQL.
Спасибо, интересный пример и временные характеристики тоже.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36668169
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRPtn,

Ваше предложение, особенно в части анализа завершенности транзакций, напоминает версионность данных в базе, как она описана по ссылке:
http://www.ibase.ru/devinfo/versions.htm
Дата и время в моей таблице
^V(код объекта, код параметра, время)=значение
это не время сохранения значения в базе, а время замера. Например, значение параметра на 14 часов может прийти в 14ч15мин. А может диспетчер ввести его в конце смены.
Мне нравится идея версионности, но делать на прикладном уровне то, что в Oracle или InterBase встроено в систему... Но не исключено, что попробую.

=Dimon=

Вы похоже на прикладном уровне реализуете транзакции? Поле deleteFlag видимо сбрасывается в 0 после того, как вся порция записана в таблицу?
Здесь выше kolesov пишет, что это излишне, если Вы работаете через объекты и SQL.
Спасибо, интересный пример и временные характеристики тоже.

Мы вообще транзакции в данном примере не используем так как есть внешний флаг конца операции добавления порции, поэтому и разночтений нет.
...
Рейтинг: 0 / 0
Блокировки, транзакции и "непротиворечивое чтение"
    #36672245
cache hit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DirksDR
С другой стороны, если блокировать каждый показатель в отдельности
lock +^V(код объекта, код параметра, время)
по мере обращения к ним при вводе и при формировании отчета, я непременно нарвусь на дедлок.


А зачем блокировать при формировании отчета? Проще проверить системную переменную ^$LOCK
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Блокировки, транзакции и "непротиворечивое чтение"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]