powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как организовать хранение и извление исторических данных?
53 сообщений из 53, показаны все 3 страниц
Как организовать хранение и извление исторических данных?
    #35265616
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, конечно, вопрос и для форума "Проектирование БД", но для начала отпишусь в "родном" форуме

Ниже описывается прототип схемы хранения истории изменения объекта и проблема, которая скоро съест мой мозг
Хочется услышать мнения умных людей по поводу структуры хранения данных (таблиц и полей), и запросов к этим структурам. А так же варианты реализации задачи :)

Имеется таблица, в которой хранится история изменения значения объекта
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE object_history (
  object_id INT4, -- id объекта
  ttime TIMESTAMP, -- время начала транзакции
  ctime TIMESTAMP DEFAULT current_timeclock(), -- реальное время создания записи
  value VARCHAR NOT NULL -- значение объекта на момент времени ttime:ctime
);

Есть функции:
1) get_object_value(int object_id) - получить значение объекта на время транзакции
2) set_object_value(int object_id, varchar value) - записать значение объекта на время транзакции

Есть так же большая обработка данных, которая выполняется (долго) в одной транзакции

Код: plaintext
1.
2.
3.
4.
5.
begin
get_object_value( 100 ); -- 1
-- много кода
get_object_value( 100 ); -- 2
-- много кода
commit;

Проблема в том, значение объекта 100, полученное в строке "1", может отличаться от значения полученного в строке "2", так как параллельно работают другие транзакции, которые могут изменить значение объекта 100.

Доп. условие задачи: Если внутри нашей транзакции у объекта изменилось значение, то при следующем вызове get_object_value должно возвратиться новое измененное значение. Изменения значения объекта в параллельных транзакциях не должны влиять на возврат функции get_object_value.

Пример.
Код: plaintext
1.
2.
3.
4.
begin;
get_value_object( 100 ); -- возвращяет 'old_value'
set_object_value( 100 , 'new_value');
get_object_value( 100 ); -- возращает 'new_value'
commit;

внутри функции get_object_value делается простой запрос (к примеру)
Код: plaintext
SELECT * FROM object_history WHERE object_id =  100  AND ttime <= now() ORDER BY time DESC, ctime  DESC

внутри функции set_object_value так же делается запрос (к примеру)
Код: plaintext
INSERT INTO object_history(object_id, ttime, value) VALUES( 100 , now(), 'new_value');

Этих двух запросов хватает почти для всех случаев.
Вот один из случаев, для которых запросы не срабатывают
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
x: sql-код -- х - номер транзакции

 1 :begin;
 1 :set_object_value( 100 , 'new_value');
      2 :begin;
      2 :get_object_value( 100 ); -- возвращает old_value
 1 :commit;
      2 :get_object_value( 100 ); -- возвращает new_value
      2 :commit;
Есть огромное желание, чтобы при втором вызове get_object_value возвращалось то же значение, что и при первом вызове или измененное значение, но измененное в той же транзакции.
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265645
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan BlackЕсть огромное желание, чтобы при втором вызове get_object_value возвращалось то же значение, что и при первом вызове или измененное значение, но измененное в той же транзакции.имхо по хорошему, что бы другие транзакции не мешались - нужно соответственно усиливать изоляцию транзакций %) но тогда придётся менять логику клиента, что бы он был готов перезапускать транзакцию которая отменилась из-за нарушения изоляции.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265652
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЁшКак и хочется избежать блокировок, оставшись на уровне изоляции Read Commited
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265680
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по идеи задача сводится к "выбрать из object_history последнюю запись с сортировкой по ctime у которой ttime = now() [текущая транзакция], если такой нет, выбрать просто последнюю запись с сортировкой по ctime" но остаётся проблема, если объект в текущей транзакции не изменялся, а в соседних - изменялся, тогда будет возвращён изменённый в соседней транзакции объект. можно запоминать состояние объекта на начало транзакции (но будет рейс кондишн между begin; и save_current_object_value(id) %) ), но имхо это не что иное как ручное эмулирование TRANSACTION ISOLATION LEVEL SERIALIZABLE =)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265690
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решается, если в записи object_history сохранять время окончания транзакции создавшей эту запись. Но как это сделать?
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265719
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблицах есть скрытые служебные поля - xmin, xmax - вот xmin - это номер транзакции (он всегда только возрастает, по идеи :) ). получается нужно выбирать только те записи, у которых xmin <= txid_current()

пример доступа к служебным полям xmin, xmax таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
seb=> select xmin,xmax, txid_current(), txid_current_snapshot(), * from t2;
 xmin | xmax | txid_current | txid_current_snapshot | id |   val2
------+------+--------------+-----------------------+----+----------
  6873  |     0  |          6888  |  6888 : 6888 :            |   1  | val1
  6874  |     0  |          6888  |  6888 : 6888 :            |   1  | val2
  6875  |     0  |          6888  |  6888 : 6888 :            |   1  | val3
  6876  |     0  |          6888  |  6888 : 6888 :            |   2  | val1 -  2 
  6877  |     0  |          6888  |  6888 : 6888 :            |   2  | val2 -  2 
  6878  |     0  |          6888  |  6888 : 6888 :            |   2  | val3 -  2 
  6880  |     0  |          6888  |  6888 : 6888 :            |   3  | val3 -  3 
  6881  |     0  |          6888  |  6888 : 6888 :            |   1  | val1 -  1 

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265734
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если "вражеская" транзакция началась раньше, то xmin будет меньше txid_current() (см. последний случай), этого условия недостаточно :(
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35265751
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, затупил, этож тоже самое что ttime %)

ps: с пятницей :)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35266018
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшда, затупил, этож тоже самое что ttime %)
ps: с пятницей :)
С субботой
однако мозг почти съеден, а проблема осталась :(
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35266725
SeniorAndre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если проблема не решается внутри системы, то на проблему надо посмотреть снаружи... :) Собственно: "А нафига?" Глядя на код у меня например возникает вопрос: "При такой структуре построения кода, зачем вообще второй вызов get_? Запиши в переменную..."
Код: plaintext
1.
2.
3.
4.
5.
begin
get_object_value( 100 ); -- 1
-- много кода
get_object_value( 100 ); -- 2
-- много кода
commit;
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35266797
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
get_... может вызываться внутри другой хп.
Код: plaintext
1.
2.
3.
4.
5.
begin
get_object_value( 100 ); -- 1
-- много кода
PERFORM proc(); -- get_object_value(100) // Вызывается внутри proc()
-- много кода
commit;
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35266944
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dan Blackget_... может вызываться внутри другой хп.А чем это мешает записать в переменную? custom_variable_classes
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35267027
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Sitnikov Dan Blackget_... может вызываться внутри другой хп.А чем это мешает записать в переменную? custom_variable_classes объектов может быть 1 000 000 000...
+ даже если в переменную можно записать массив, доступ к его элементам будет осуществляться без индексов, что существенно замедлит работу хп
+ к тому же использование custom_variable_classes противоречит моей религии
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35267529
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dan Black Vladimir Sitnikov Dan Blackget_... может вызываться внутри другой хп.А чем это мешает записать в переменную? custom_variable_classes объектов может быть 1 000 000 000...И все они нужны одновременно? Ню ню. Сколько времени вы этот миллиард обрабатывать будете?

Dan Black+ к тому же использование custom_variable_classes противоречит моей религии
Ах да, религия, когда всё должно соотвествовать стандартам ansi sql-81, где нельзя менять уровни изоляции и т.п.


Добавьте поддержку "select * from table as of timestamp(...)" -- глядишь не только вам пригодится.

Если религия позволяет триггеры, то timetravel вам в руки
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35267749
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir SitnikovИ все они нужны одновременно? Ню ню. Сколько времени вы этот миллиард обрабатывать будете?Ладно, нужно будет только 1000 объектов. Это что-то изменит? ;)))
Vladimir SitnikovАх да, религия, когда всё должно соотвествовать стандартам ansi sql-81, где нельзя менять уровни изоляции и т.п.Религия позволяет менять уровень изоляции транзакций, но в данном случае есть строгое требование, которое нельзя обойти.

Vladimir SitnikovЕсли религия позволяет триггеры, то timetravel вам в рукиПри уровне изоляции Read Commited там возникает такая же проблема, что я описал в конце своего первого топика.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35267902
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Black
Код: plaintext
1.
2.
3.
4.
5.
begin
get_object_value( 100 ); -- 1
-- много кода
get_object_value( 100 ); -- 2
-- много кода
commit;

Проблема в том, значение объекта 100, полученное в строке "1", может отличаться от значения полученного в строке "2", так как параллельно работают другие транзакции, которые могут изменить значение объекта 100.

Доп. условие задачи: Если внутри нашей транзакции у объекта изменилось значение, то при следующем вызове get_object_value должно возвратиться новое измененное значение. Изменения значения объекта в параллельных транзакциях не должны влиять на возврат функции get_object_value. наверное должен помочь SELECT ... FOR { UPDATE | SHARE }
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35267937
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatнаверное должен помочь SELECT ... FOR { UPDATE | SHARE }Чтение не должно блокировать другие транзакции, изменение значения объекта в параллельных транзакциях не должно блокировать чтение в текущей транзакции
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268093
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в самом начале транзакции узнать минимальный из xid-ов работающих сейчас транзакций, запомнить в переменную. в get_object_value делать where xmin<$OTHER_RUNNING_MIN_XID or xmin=txid_current(). при этом не будут учитываться изменения не только других работавших на момент старта транзакций, но и транзакций, ктоторые уже закончились, но начались позже какой-то из работавших на момент старта.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268116
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Black
Ниже описывается прототип схемы хранения истории изменения объекта и проблема, которая скоро съест мой мозг
Хочется услышать мнения умных людей по поводу структуры хранения данных (таблиц и полей), и запросов к этим структурам. А так же варианты реализации задачи :)

...
Доп. условие задачи: Если внутри нашей транзакции у объекта изменилось значение, то при следующем вызове get_object_value должно???? возвратиться новое измененное значение. Изменения значения объекта в параллельных транзакциях не должны влиять на возврат функции get_object_value.

Пример.
Код: plaintext
1.
2.
3.
4.
begin;
get_value_object( 100 ); -- возвращяет 'old_value'
set_object_value( 100 , 'new_value');
get_object_value( 100 ); -- возращает 'new_value'
commit;

внутри функции get_object_value делается простой запрос (к примеру)
Код: plaintext
SELECT * FROM object_history WHERE object_id =  100  AND ttime <= now() ORDER BY time DESC, ctime  DESC

внутри функции set_object_value так же делается запрос (к примеру)
Код: plaintext
INSERT INTO object_history(object_id, ttime, value) VALUES( 100 , now(), 'new_value');

Этих двух запросов хватает почти для всех случаев.
Вот один из случаев, для которых запросы не срабатывают
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
x: sql-код -- х - номер транзакции

 1 :begin;
 1 :set_object_value( 100 , 'new_value');
      2 :begin;
      2 :get_object_value( 100 ); -- возвращает old_value
 1 :commit;
      2 :get_object_value( 100 ); -- возвращает new_value
      2 :commit;
Есть огромное желание, чтобы при втором вызове get_object_value возвращалось то же значение, что и при первом вызове или измененное значение, но измененное в той же транзакции.
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
если действительно нужна исторя изменения величины, то "дополнительное условие задачи" этому просто противоречит.

ну допустим, что нужно нечто, таки похожее на историю изменения, но ведущее согласно доп условию.
Тогда, в истории, если верить предыдущим комментаторам, всегда можно найти данные, записанные _этой_ транзакцией (или их отсутствие). (как получить текущую транзакцию xmin - вопрос наверное не ко мне, (хотя я могу придумать). Т.е. в get_ вы сначала лезете в историю по номеру текущей транзакции, и только при их отсутствии - ищете другие. Где-то так. Нет?
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268135
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatв самом начале транзакции узнать минимальный из xid-ов работающих сейчас транзакций, запомнить в переменную. в get_object_value делать where xmin<$OTHER_RUNNING_MIN_XID or xmin=txid_current(). при этом не будут учитываться изменения не только других работавших на момент старта транзакций, но и транзакций, ктоторые уже закончились, но начались позже какой-то из работавших на момент старта.Переход на 8.3 планируется только через полгода, поэтому использовать txid_current() и прочих подобных функций нет возможности.
+ хочется решить задачу структурно (с помощью особой организации данных) (вырожденным случаем является использование sql-81 (с) Vladimir Sitnikov )
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268156
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321если действительно нужна исторя изменения величины, то "дополнительное условие задачи" этому просто противоречит.
ну допустим, что нужно нечто, таки похожее на историю изменения, но ведущее согласно доп условию.
Тогда, в истории, если верить предыдущим комментаторам, всегда можно найти данные, записанные _этой_ транзакцией (или их отсутствие). (как получить текущую транзакцию xmin - вопрос наверное не ко мне, (хотя я могу придумать). Т.е. в get_ вы сначала лезете в историю по номеру текущей транзакции, и только при их отсутствии - ищете другие. Где-то так. Нет?Где-то так.
Ищу данные записанные в этой транзакции, если не нахожу, то смотрю данные записанные транзакциями завершившимися до начала текущей транзакции. Всё это решается установкой уровня транзакции Serializable, но такой возможности нет в силу других требований. Поэтому и ломаю голову, можно ли с использованием Read Committed, решить вопрос видимости данных (через запросы и структуры данных) аналогично действию уровня Serializable.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268228
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan BlackГде-то так.
Ищу данные записанные в этой транзакции, если не нахожу, то смотрю данные записанные транзакциями завершившимися до начала текущей транзакции. Всё это решается установкой уровня транзакции Serializable, но такой возможности нет в силу других требований. Поэтому и ломаю голову, можно ли с использованием Read Committed, решить вопрос видимости данных (через запросы и структуры данных) аналогично действию уровня Serializable.вы наверное меня не поняли. Я рассказал, как получить искомое при Read Committed.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268302
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321вы наверное меня не поняли. Я рассказал, как получить искомое при Read Committed.Не понял :) объясните подробнее, пожалуйста
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268348
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321... при их отсутствии - ищете другие ...вот в этот момент, если как в примере транзакция один завершилась в середине транзакции два - в выборку в транзакции два попадёт изменённое в транзакции один значение (так как номер транзакции один (её дата начала) меньше номера транзакции два) - невыходит :)
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268652
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах да, я кажется понял . Вы о повторном чтении после только чтения , а не записи. Признаю невнимательность. Ну так сделайте ф-ю get пишущей . (можно даже не туда). (Вам же надо зафиксировать сам факт чтения).
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268687
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочел еще раз про кастом_вариации и массивы объектов и индексы... так вот, temp таблицы вполне индексируемы.
создаете temp таблицу (со всеми нужными индексами) первым get/set-ом. И хороши они тем, что их вакуумить не надо. Т.е. для фиксации фактов единичной транзакции, причем массовых фактов, с индексными поисками - они - самое то.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268697
Dan Black, не поясните, что заставляет использовать такой экзотический способ регистрации изменений?
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268732
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321прочел еще раз про кастом_вариации и массивы объектов и индексы... так вот, temp таблицы вполне индексируемы.
создаете temp таблицу (со всеми нужными индексами) первым get/set-ом. И хороши они тем, что их вакуумить не надо. Т.е. для фиксации фактов единичной транзакции, причем массовых фактов, с индексными поисками - они - самое то.Идея про временные таблицы неплохая :) попробую на неделе проверить удобство использования и производительность
правда, придётся смириться с фактом, что эмуляция Serializable будет не полная, но и то хлеб :)
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268744
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающийDan Black, не поясните, что заставляет использовать такой экзотический способ регистрации изменений?Ничего необычного не вижу в способе регистрации изменений. Есть объект, состояние которого изменяется во времени. Надо отслеживать изменения и иметь возможность получать состояние объекта на произвольный момент времени.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268845
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Blackпридётся смириться с фактом, что эмуляция Serializable будет не полная, но и то хлеб :)да, из этой эмуляции выпадает всё то, что произвело изменения _до_ начала текущей транзакции, но было закоммиченно _после_ ее начала, причем _до_ первого опроса текущей транзакцией данного исторического значения. Для закрытия этой дыры надо писать еще куда-то и моменты окончания транзакций . Что, как мне видится, довольно сложно. При этом, даже если мы запишем эти данные, получить неизменные данные можно будет только в таблице историй (отсекая поздние). Если же в базе есть не только логгируемые данные - их состояние на момент старта получить уже будет нельзя. (т.е. тогда от честного сериалайзбл не уйти).


Может быть записывать в начале транзакции во времянку id-ки всех запущенных транзакций? (покурочить на эту тему pg_stat_activity). И считать "временем старта" нашей тр-ии время этого стартового опроса ид транзакций. Но потребуется четкое требование любую транзакцию начинать с такой записи ид-ков всех незавершенных тр-й.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268908
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за участие в дискуссии. Решение с временными таблицами мне видится наиболее применимым не смотря на сложность и ограниченность (ведь хотелось-то обойтись одним-двумя запросами , но не судьба ).
Если у кого-то появятся мысли, как решить задачу проще, то велкам!
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268913
> Ничего необычного не вижу

Жаль. 4321 вам уже рассказал, как вы теряете данные. А я расскажу о том, что использовать плоский лог для регистрации изменений связанных данных невозможно.

> Есть объект

В реляционных СУБД нет объектов.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35268980
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающийЖаль. 4321 вам уже рассказал, как вы теряете данные. А я расскажу о том, что использовать плоский лог для регистрации изменений связанных данных невозможно.
Объясните, где я потеряю данные?
А так же интересно почитать про регистрацию изменений связных данных.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35270637
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Black Объясните, где я потеряю данные? наверное имелось в виду, что если у вас все данные - именно таким вот образом "логированные "версии", то у вас нет механизма разрешения (да и самого возникновения ) коллизий. Т.е. у вас как-бы параллельно может существовать несколько исторических нитей (цепочек транзакций) изменения данных, ничего не знающие друг о друге кроме исходной точки (момента запуска первых транзакций этих параллельных цепочек). Поскольку "апдейт", вызывающий в нормальной ситуации блокировку изменяемой записи до конца транзакции у вас заменен на инсерт. А он, инсерт, ничего не блокирует (только не отдает свою запись другим транзакциям до коммита, т.ч. другие транзы спокойно пользуют "параллельные версии"). Коллизий напрочь не возникает (т.е. ситуация не то что не эмулирует сериалайзебл, но много хуже Read Commited). Возникают самостоятельные ветки в истории, обрываемые (теряющие значение) коммитом последней "параллельной" транзакции. Если же механизм логгирования дублируется еще и апдейтом в "обычной" таблице - то в зависимости от существования в схеме в т.ч. "нелоггируемых" - т.е. "обычных данных" (поставляющих вам блокировки апдейтуемых транзакциями величин для поддержания логической связности обновлений), или даже при логгировании всех - от порядка опроса данных в процессе разных транзакций вы будете иметь дырки в имитации сериалайзебл режима с точностью до разрыва в порядках опроса "объектов".

Т.е. как я сначала говорил - требования несколько противоречивы, (позволяют "расщепление" историй данных). но вполне может быть, что именно это вам и требуется.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35270732
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321Да. Что мне в итоге надо, я получу :) Механизм решения конфликтов есть и работает.
(Конфликты - это результат работы процедуры, меня же интересовало как получить "правильные" исходные данные для обработки)
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35270860
> другие транзы спокойно пользуют "параллельные версии"

Да, это и имел в виду. И все будет совсем плохо, если должны меняться связанные данные: апдейты могут пройти из разных транзакций и корректно откатить изменения невозможно. В результате получится куча мусора вместо базы данных. Вот я и спросил: для чего нужно так извращаться? В этом есть какой-то сакральный смысл?
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35270937
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающийдля чего нужно так извращаться? Вижу извращение только в ограничении на вид изоляции транзакций, но ничего с этим сделать не могу.
А где Вы видите извращение?
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271007
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Black 4321Да. Что мне в итоге надо, я получу :) Механизм решения конфликтов есть и работает. если расскажете о механизме генерации и разрешения конфликтов в вашей схеме исторических данных - то это будет интересно. Пока же я вижу, что никаких "конфликтов" у вас возникать не будет, а будут возникать параллельно-независимые "кучи мусора", перекатываемые в параллельных цепочках транзакций и уносимые периодически вникуда. (там что-то типа механизма согласования мультимастер реплик просится - на каждый коммит транзакции)
Dan Black(Конфликты - это результат работы процедуры, меня же интересовало как получить "правильные" исходные данные для обработки)конфликты логики - это то, что куча транзакций будет возиться с неактуальными ветками "истории" данных, так и не пошедшими в итоге в дело. Кто у вас, кроме механической очередности стартов, будет определять, какая куча транзакций дожна пойти в такой-вот мусор? а конфликтов-то при этом между транзакциями (из-за блокировки) и не возникнет.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271070
> А где Вы видите извращение?

Предложенная реализация. Это не история изменений, а модель Теории Хаоса.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271090
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема дисскуссии ушла в сторону
4321Основная проблема - чтение согласованных данных из разных таблиц при уровне изоляции транзакции Read Commited, желательно без лишних телодвижений. Все данные, которые надо прочитать, при этом хранят историю изменений. Вот и возникла мысль, а возможно ли и рыбку съесть (прочитать актуальные на начало транзакции) и косточкой не подавиться (сделать это, не изменяя уровень изоляции)? Проблема параллельных историй не существует, так как если такое обнаруживается, то происходит либо полный откат транзакции с выдачей ошибки, либо повторный перезапуск транзакции :)
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271096
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающий> А где Вы видите извращение?
Предложенная реализация. Это не история изменений, а модель Теории Хаоса.Предложите свой вариант, думаю, не одному мне будет интересно узнать, что-то новое и полезное
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271174
> Предложите свой вариант

Вот так вот за пять минут взять и нарисовать? :?) Вы не задумывались, почему нигде, ни в свободных продуктах, ни в коммерческих, нет нормальной реализации истории изменений? Задачка только кажется простой.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271204
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающий> Предложите свой вариант
Вот так вот за пять минут взять и нарисовать? :?) Вы не задумывались, почему нигде, ни в свободных продуктах, ни в коммерческих, нет нормальной реализации истории изменений? Задачка только кажется простой.Ну и кто Вы после этого? Вам сюда
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271232
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan BlackПроблема параллельных историй не существует, так как если такое обнаруживается, то происходит либо полный откат транзакции с выдачей ошибки, либо повторный перезапуск транзакции :)ну вот как раз и интересно, зачем вам руками создавать такие же проблемы, что вам создает простой "честный сериалайзебл". Или вы думаете, что рукотворный будет чуть быстрее? Кстати, а как вы проверяете "параллельность" историй данного? Это ведь, пожалуй, самое интересное.


Т.е. на выходе, если предыдущее данное "истории" не совпадает с тем, которое было использовано в транзакции - Вы откатываете всю транзакцию? При этом у вас и транзакции длинные, и блокировок меж ними нет? Тогда, пожалуй, достаточно обнаружить единственный коммит другой транзакции в читаемое или хуже того - меняемое данное - и сразу сливать воду - т.е. рестартовать транзакцию с самого начала (сейвпойнт ставить в самом начале, а в гет_валуе и сет_валуе генерировать ерроры битым текстом). Или у вас есть какие-то послабления относительно допустимости использования в транзакции неактуальных (на момент ее окончания) входных данных? Т.е. на разрыв и похеривание веток историй (их части) какого-то подмножества данных? И за счет этого вы хотите обойти "честный сериалайзебл"
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271270
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПС ах, да я забыл случай, когда величины принимают значения из очень небольшого набора (скажем всего из 2-х значений) . Тогда даже если к моменту завершения транзакции было прокммичено множество параллельных историй, тем не менее вероятность того, что в истории "поучаствовало" правильное данное будет около 1/2. Правда если в транзакции попользовались N данными, и все они меняются независимо, то вероятность придти к такому же состоянию истории, как на момент старта транзакции становится (1/2)**N т.е. уже при N>~3 на такое "улучшение" можно честно плевать.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271286
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321Обход "честного serializable" и проверка на параллельное измение истории происходит с помощью оптимистической блокировки объекта, с историей изменения которого работает процедура. Получается практически полная эмуляция транзакции Serializable.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271366
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Black 4321Обход "честного serializable" и проверка на параллельное измение истории происходит с помощью оптимистической блокировки объекта, с историей изменения которого работает процедура. Получается практически полная эмуляция транзакции Serializable.
- т.е. у вас кроме таблицы историй , есть еще собственно "объекты" (таблица собственно объектов), которые, скажем, что-то типа "SELECT FOR UPDATE-тятся". Причем вы блокируете так все "объекты" _читаемые_ в транзакции?

Или я опять что-то не так понял?
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271448
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321- т.е. у вас кроме таблицы историй , есть еще собственно "объекты" (таблица собственно объектов), которые, скажем, что-то типа "SELECT FOR UPDATE-тятся". Причем вы блокируете так все "объекты" _читаемые_ в транзакции?
Или я опять что-то не так понял?
Да, есть таблица "объектов", которая служит, в частности, и для блокировок. Блокировка происходит только для объектов, состояние которых изменяется внутри транзакции.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271620
> Ну и кто Вы после этого?

Тот, кто знает, как должна быть реализована история изменений. Если Ваш проект под GPL v.3, готов обсудить варианты. Если это коммерческий проект - разгребайте свое дерьмо самостоятельно.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271701
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающий> Ну и кто Вы после этого?
Тот, кто знает, как должна быть реализована история изменений. Слова, слова... от Вас не заметил ни одного дельного замечания. Один трёп... ;) а теперь ещё бездоказательное высказывания о том "как я крут, что я знаю, как правильно реализуется история изменения, но никому не скажу" (а не скажете, потому что боитесь, что в этом форуме Вашу замечательную правильную модель истории раскритикуют, и она окажется не такой уж и правильной )

Истина рождается в споре...
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35271819
> Истина рождается в споре...

Вы заблуждаетесь, если думаете, что мне интересно с Вами спорить. С удовольствием помогу разработчикам интересных открытых продуктов. Для всех прочих мне жаль своего времени.
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35272395
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostreSQL начинающий> Истина рождается в споре...
Вы заблуждаетесь, если думаете, что мне интересно с Вами спорить. С удовольствием помогу разработчикам интересных открытых продуктов. Для всех прочих мне жаль своего времени.Зачем тогда вообще надо было писать в этот топик???
Ладно, я сегодня добрый, слив засчитан
...
Рейтинг: 0 / 0
Как организовать хранение и извление исторических данных?
    #35272475
> Зачем тогда вообще надо было писать в этот топик???

Тема интересная. А то, что автор вопроса глуп, сначала было не понятно.
Модератор:
Это уже никому не интересно. =\
Люди, если есть что по сабжу - пишите, нет - заканчиваем балаган.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как организовать хранение и извление исторических данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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