Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как пометить транзакцию / 18 сообщений из 18, страница 1 из 1
23.09.2007, 16:05
    #34820039
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Есть таблица с данными, данные как обновляются так и добавляются.
Как можно выбрать данные "порожденные" одной транзакцией?
...
Рейтинг: 0 / 0
23.09.2007, 18:32
    #34820134
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Можно по системному столбцу xmin. Правда, я не очень люблю привязываться к системным столбцам. Лучше сделать свой аналог, который не "сломается" при смене версий СУБД.
...
Рейтинг: 0 / 0
25.09.2007, 12:19
    #34823898
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Как сделать свой?
Это же не просто уникальный ключ, а у никальный только для разных транзакций.

Как сгенерить рандомное число, кторого в столбце на данный момент не существует?
...
Рейтинг: 0 / 0
25.09.2007, 12:26
    #34823933
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Алексей КлючниковКак сделать свой?
Это же не просто уникальный ключ, а у никальный только для разных транзакций.

Как сгенерить рандомное число, кторого в столбце на данный момент не существует?Использовать последовательность. (sequence)
...
Рейтинг: 0 / 0
30.09.2007, 13:17
    #34836911
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
ага, sequence.
Можно как то вставить ее в default значение поля, таким образом чтобы оно вставлялось при комитте.
т.е. не контролировать установку этого ключа в самих ХП, а чтобы оно само автоматом ставилось при завершении транзакции на все модифицированные данные?
Или это фантастика? :)
...
Рейтинг: 0 / 0
30.09.2007, 15:43
    #34836987
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Алексей Ключниковага, sequence.
Можно как то вставить ее в default значение поля, таким образом чтобы оно вставлялось при комитте.
т.е. не контролировать установку этого ключа в самих ХП, а чтобы оно само автоматом ставилось при завершении транзакции на все модифицированные данные?
Или это фантастика? :)Посмотрите, как устроено поле типа serial.
Код: plaintext
1.
ALTER TABLE mailbox ALTER COLUMN msgid SET DEFAULT nextval('mailbox_msgid_seq'::regclass);
Но это будет срабатывать на каждую вставку в таблицу. Вам нужно как-то исхитриться. Например, использовать curval, но в начале транзакции гарантированно вызывать nextval (иначе будете получать ошибку).
...
Рейтинг: 0 / 0
30.09.2007, 16:15
    #34836997
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Исхитряться придется не слабо.

некоторые функции могут использоваться и как начинающие транзакцию и как промежуточные.
В принципе эта проблема тоже решается добавлением ключа в параметры функции а потом его проверка.

И еще придется все время помнить какая функция в каком случае является начинающей транзакцию :(
...
Рейтинг: 0 / 0
30.09.2007, 16:46
    #34837014
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Алексей КлючниковИсхитряться придется не слабо.

некоторые функции могут использоваться и как начинающие транзакцию и как промежуточные.
В принципе эта проблема тоже решается добавлением ключа в параметры функции а потом его проверка.

И еще придется все время помнить какая функция в каком случае является начинающей транзакцию :(Напишите функцию, в ней вызывайте curval, ловите ошибку. если она есть (значит вы первый в транзакции), делайте nextval.
Эту функцию повесьте в default
...
Рейтинг: 0 / 0
30.09.2007, 17:34
    #34837042
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
currval дает последнее полученное значение последовательности в рамках сеанса, а не транзакции.
...
Рейтинг: 0 / 0
30.09.2007, 17:48
    #34837052
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Nick Gazaloffcurrval дает последнее полученное значение последовательности в рамках сеанса, а не транзакции.мдя, точно. Зарапортовался.
...
Рейтинг: 0 / 0
01.10.2007, 09:41
    #34837527
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
А что если "замутить" времянку со временем жизни данных - транзакция? Если пустая - то заполнить nextval()'ом, если полная - то взять оттуда число? По скольку dirty read в ПГ нету - все должно быть ОК.
...
Рейтинг: 0 / 0
01.10.2007, 18:36
    #34839192
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Andrey DaeronА что если "замутить" времянку со временем жизни данных - транзакция? Если пустая - то заполнить nextval()'ом, если полная - то взять оттуда число? По скольку dirty read в ПГ нету - все должно быть ОК.
можно чуть чуть по подроднее? :)
...
Рейтинг: 0 / 0
01.10.2007, 18:37
    #34839197
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
т.е. темповую таблицу? наверное сработает..
...
Рейтинг: 0 / 0
01.10.2007, 18:42
    #34839208
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Алексей Ключниковт.е. темповую таблицу? наверное сработает..
Угу. Именно временную таблицу.
...
Рейтинг: 0 / 0
01.10.2007, 21:29
    #34839485
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
В пакете skytools есть модуль txid, а в нем функция get_current_txid() returns int8. То, что нужно. Воткнуть ее в DEFAULT поля типа int8, и вот вам поле с ID транзакции. Только учтите, что этот ID через некоторое время wraps around, так что индексировать и делать выборки только по одному txid бесполезно, результат будет неверным.

http://pgfoundry.org/projects/skytools/
...
Рейтинг: 0 / 0
02.10.2007, 15:06
    #34841130
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Nick Gazaloffчерез некоторое время wraps around
http://pgfoundry.org/projects/skytools/
интересно зачем и когда? ведь инт8 должно бы хватить на все жизнь..

зы спасибо за решение
...
Рейтинг: 0 / 0
02.10.2007, 23:12
    #34842374
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Да, ошибся. Посмотрел внимательно README.txid. Внутренний txid в Postgres и правда wraps, а этот модуль генерит свой, гарантированно уникальный.
...
Рейтинг: 0 / 0
03.10.2007, 14:35
    #34844001
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пометить транзакцию
Ну теперь вообще все замечательно! :)

Всем спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как пометить транзакцию / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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