Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Есть большая глобаль вида ^V(код объекта, код параметра, время)=значение. В нее постоянно сыплются данные и из нее формируются отчеты. Ввод данных идет по нескольку строк (4 и больше) в одной транзакции - исходный показатель плюс пересчет производных(зависимых) показателей. Отчеты содержат по несколько сотен показателей на определенное время. Насколько я понимаю, мне придется использовать для отчетов разделяемую блокировку вроде lock ^V#"S":10 а для записи эксклюзивную вроде lock ^V:10 Очень не нравится, что приходится блокировать глобаль целиком, но другого способа получить в отчете непротиворечивые данные я не вижу. С другой стороны, если блокировать каждый показатель в отдельности lock +^V(код объекта, код параметра, время) по мере обращения к ним при вводе и при формировании отчета, я непременно нарвусь на дедлок. Как решаете такие проблемы, коллеги? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2010, 16:19 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
я так понимаю, у вас значения старых данных сохраняются в истории, а изменения идут путем дозаписи новых величин не изменяя старые? Тогда зачем блокировка для отчета? Делайте сбор данных на определенный момент времени - они будут непротиворечивы. А просто если вы прямым перебором глобала будете делать отчет, то у вас данные будут сомнительными даже в случае непротиворечивости чтения и записи отдельных параметров - для объектов с маленькими кодами они всегда будут более старыми, чем для объектов с большими(по сортировке) кодами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2010, 16:35 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDR , не совсем понятна твоя проблема... Ведь у тебя есть третий параметр "время". Т.о. можно делать отчет на некое время. Или данные вносятся "задним числом"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2010, 16:37 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDR, Есть подобная необходимость. Решаем так: - запись исключительно через объекты (структура хранения дефолтная, записывается единовременно от 1 до 30 объектов) - чтение через SQL А они уж между собой как-то умудряются разбираться. Я об этом не задумываюсь. В табличке 84 млн. записей. Работает она больше года. Т.е. в день примерно 200-300 тысяч записей валится. Сейчас думаю больше, чем год назад... Отчеты строятся тоже постоянно - не раз в минуту, так раз в 10 минут. Проблем не наблюдали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 04:57 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Блок А.Н., krvsa ...я так понимаю, у вас значения старых данных сохраняются в истории, а изменения идут путем дозаписи новых величин не изменяя старые? Нет, время это вполне конкретное, либо граница суток, либо 2-х часов, и изменение значения показателя на это время заменяет предыдущее. Я думал насчет использования дополнительного индекса, назовем его N, который содержал бы порядковый номер обращения к глобали, неважно, на запись или чтение. Тогда можно было бы выбирать в отчет записи, у которых N меньше, чем N запроса. В этом случае можно вообще не блокировать глобаль. Смущает меня то, что производные показатели верхнего уровня (по цеху, предприятию) зависят от тысяч исходных показателей на технологических объектах, т.е. пересчитываются при вводе каждого i-го исходного показателя. Они будут иметь тысячи версий значений по N(i). Выигрываем в отсутствии блокировок, проигрываем в увеличении размера базы, некотором усложнении программы. Каждые 2 часа приходит 2-3 тысячи исходных значений, половина с телемеханики, вторая половина ручной ввод. Рассчитывается до 1тыс производных показателей, 90% которых имеет 2-5 исходных, 10% - от 100 до 2000. Двухчасовые сводки смотрят до 30 пользователей, суточные сводки поутру смотрят примерно 100 пользователей. Считаете есть смысл вводить версионность значений, чтобы уйти от блокировок? kolesov ...структура хранения дефолтная, записывается единовременно от 1 до 30 объектов. По моему, если транзакция обновляет больше одной записи, то не обойтись без блокировок. Иначе отчет может выбрать одну запись до отработки транзакции, а другую после. И, если их значения между собой как-то связаны, мы получим в отчете противоречивые данные. Видимо, объекты и SQL как-то используют блокировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 09:41 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDRВидимо, объекты и SQL как-то используют блокировки. AboutConcurrency ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 12:39 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDRСчитаете есть смысл вводить версионность значений, чтобы уйти от блокировок? Для начала лучше подробнее узнать о структуре хранения данных и что там что... А так, показал нам один глобал... Поля назвал... И понимай как хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 13:13 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Хм 1 По идее хорошо бы блокировать при изменении "объект". Но так как они у вас взаимосвзяанные и имеют смысл только все в совокупности, то при изменении одного параметра нужно блокировать всю ветку "объектов" до тех пор, пока изменение не будет проведено. Причем, по-видимому придется это делать в транзакции. Здесь минусы в том, что постоянно система будет находиться в процессе установления или снятия блокировок - это будет основное время ее работы. Если натыкаемся на перекрестные блокировки, то откатываем все, ждем и делаем сначала. Отчет будет проходить по "объектам", ставя на каждом шаред-блокировку. Если натыкается на эксклюзив блокировку, то стоит и ждет, пока она не снимется эксклюзив-блокировка. Минус - замедление работы отчета и внесения изменений из-за работы с блокировками. 2. Блокируем всю систему(глобал) и работаем по очереди. Рабочий процесс будет быстрее, но число одновременно работающих процессов будет меньше. 3. Версионность Че-то мне этот путь не нравится. Так как у вас имеет смысл ветка значений, то версии нужно создавать для всей ветки. Проблемы даже страшно представить Я склоняюсь к первому варианту. под объектом я понимаю некоторую сущность, связанный набор параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 13:20 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Да, и имейте ввиду, что имя блокировки никакого отношения к самому глобалу не имеет Уж не знаю по какой традиции оно обычно делается таким же, как и глобал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 13:24 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Блок А.Н., Спасибо, беру таймоут, надо обмозговать это дело. Попробую вариант 2 как самый простой. Почитаю про версионность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 17:17 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDRОтчеты содержат по несколько сотен показателей на определенное время. Ну если исходить из предположения что параметры у вас меняются с нарастающим временем, то всё что вам нужно - это узнать в какой момент времени закончилась транзакция и следовательно изменение данных. Тогда отчету дается это время и он не выбирает данные раньше него. В принципе можно решить это добавив в перед и/или после завершением транзакции в процедуре записи параметров, что то вроде Код: plaintext 1. Таким образом будете знать - в какой последний момент $TL был равен 0-ю, и выбирать до него - ну там с погрешностью какой то - вместо $H использовать $ZH там миллисекунды... ЗЫ: это если я правильно задачу понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2010, 22:14 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
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' автоматически использует пересечения индексов и построение оптимального плана выборки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2010, 06:58 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
Ptn, Ваше предложение, особенно в части анализа завершенности транзакций, напоминает версионность данных в базе, как она описана по ссылке: http://www.ibase.ru/devinfo/versions.htm Дата и время в моей таблице ^V(код объекта, код параметра, время)=значение это не время сохранения значения в базе, а время замера. Например, значение параметра на 14 часов может прийти в 14ч15мин. А может диспетчер ввести его в конце смены. Мне нравится идея версионности, но делать на прикладном уровне то, что в Oracle или InterBase встроено в систему... Но не исключено, что попробую. =Dimon= Вы похоже на прикладном уровне реализуете транзакции? Поле deleteFlag видимо сбрасывается в 0 после того, как вся порция записана в таблицу? Здесь выше kolesov пишет, что это излишне, если Вы работаете через объекты и SQL. Спасибо, интересный пример и временные характеристики тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2010, 14:19 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDRPtn, Ваше предложение, особенно в части анализа завершенности транзакций, напоминает версионность данных в базе, как она описана по ссылке: http://www.ibase.ru/devinfo/versions.htm Дата и время в моей таблице ^V(код объекта, код параметра, время)=значение это не время сохранения значения в базе, а время замера. Например, значение параметра на 14 часов может прийти в 14ч15мин. А может диспетчер ввести его в конце смены. Мне нравится идея версионности, но делать на прикладном уровне то, что в Oracle или InterBase встроено в систему... Но не исключено, что попробую. =Dimon= Вы похоже на прикладном уровне реализуете транзакции? Поле deleteFlag видимо сбрасывается в 0 после того, как вся порция записана в таблицу? Здесь выше kolesov пишет, что это излишне, если Вы работаете через объекты и SQL. Спасибо, интересный пример и временные характеристики тоже. Мы вообще транзакции в данном примере не используем так как есть внешний флаг конца операции добавления порции, поэтому и разночтений нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 04:32 |
|
||
|
Блокировки, транзакции и "непротиворечивое чтение"
|
|||
|---|---|---|---|
|
#18+
DirksDR С другой стороны, если блокировать каждый показатель в отдельности lock +^V(код объекта, код параметра, время) по мере обращения к ним при вводе и при формировании отчета, я непременно нарвусь на дедлок. А зачем блокировать при формировании отчета? Проще проверить системную переменную ^$LOCK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2010, 05:38 |
|
||
|
|

start [/forum/topic.php?fid=39&fpage=50&tid=1558049]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 325ms |

| 0 / 0 |
