powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Распределенные транзакции
25 сообщений из 26, страница 1 из 2
Распределенные транзакции
    #38057655
DAntonio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Нигде не могу найти информацию по поводу того, как же проводить распределенные транзакции в постгресе.
Знаю, что для этого необходимо использовать PREPARE TRANSACTION, но как записать данные в удалённую базу?
Единственное, что я нашёл, это dblink. Использую его так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
BEGIN TRANSACTION;
SELECT dblink_connect('conn', 'hostaddr=<IP> port=<PORT> dbname=<DBNAME> user=<USERNAME> password=<PASSWORD>');

INSERT INTO ...;
SELECT * FROM dblink('conn', 'INSERT INTO ...') as res(r text);
--SELECT dblink_exec('INSERT INTO ...');
PREPARE TRANSACTION 'tx';



Пробовал и dblink и dblink_exec, но в обоих случаях данные коммитятся в удаленную базу сразу же, не дожидаясь того, как я закоммичу транзакцию.
Сооветственно, в случае
Код: plsql
1.
ROLLBACK PREPARED 'tx'

данные из удалённой базы не откатываются.
Видимо dblink не поддерживает транзакции? Или что-то не так?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38057671
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAntonio,

http://www.postgresql.org/docs/9.2/static/sql-prepare-transaction.html

вы наверняка решаете не ту задачу и не так.

двухфазный коммит нужен при реализации менеджеров распределенных траназакций.

какая у вас исходная проблема? зачем вам всё это?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38057686
DAntonio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции.
Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38057765
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверахоткрыть несколько коннектов - к каждому серверу.

DAntonioно как записать данные в удалённую базу?подключиться к удаленному серверу.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38057793
DAntonio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

А как сделать это в одной транзакции и всё откатить в случае неудачи?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38058861
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAntonio,

вообще-то никак.

для подобных проблем, согласование транзакционных машин, имеются два рабочих подхода.

1) менеджеры распределенных транзакций, внутри которых протокол двухфазный как раз и еще немного всякой требухи.
2) "транзакционные" очереди - ивентуал-консиcтенси.

--

1)

http://en.wikipedia.org/wiki/Two-phase_commit
http://ru.wikipedia.org/wiki/XA_Транзакции

и данная штука вам, в том числе, будет обеспечивать, что система может достигать состояния, когда все вовлеченные в X-транзакцию транзакции-внутри-узлов могут быть в будущем гарантированно закоммиченны (на второй фазе как раз).

при этом "синхронность" второй фазы вам никто не обещает. и суть, каждая i-ая транзакционная машина сама по себе ничего не знает о глобальном замысле) и её состояние может быть не согласованно с состоянием глобальной X-транзакции, в том плане, что Х еще не закоммичена, а х-i-тая транзакция (на узле i которая) уже закоммичена.

вооот.

ну и вопрос с падениями/восстановлениями. после восстановлений любого из узлов и/или менеджера (который сам по себе тоже транзакционная машина - такая же база) - надо всё "чекать" на согласованность с менеджером. это сложно. но этого можно избежать если коммит синхронный с записью в вал. что, кстати, по дефолту в пг и в добавок может контролироваться с точностью до каждой конкретной транзакции.

--

2)

http://en.wikipedia.org/wiki/Eventual_consistency

тут суть в том, что событие создается в источнике, в той же транзакции локальной что и полезное действие. а потом уже событие доставляется на другой узел и там "проигрывается". (доставка асинхронная в общем виде всегда)

но тут получаем три момента.

2.1) всё может казаться более асинхронным, чем в первом варианте
2.2) можем получить аварию первого рода. на другом узле проигралось, а в источнике событие после этого не проапдейтилось. тогда событие придет еще раз в другой узел - надо быть к этому готовыми.
2.3) можем получить аварию второго рода. случилось "падение" источника, а восстановление в нём удалось не до самой последней транзакции. тогда возможно на другом узле уже успели проиграться события из "параллельной" вселенной, которая умерла. то есть события доставились, транзакции которых недовостановились в источнике. надо тоже проводить синхронизацию убежавшей в "несбыточное" будущее другой базы. ну или касательно падения другой базы, события из источника надо суметь сгенерить повторно, с момента до которого восстановили другую базу. но аварию второго рода можно так же избежать применяя везде синхронный коммит (как и в случае с падениями/востановлениями при распред транзакции).
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38059139
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAntonioLeXa NalBat,

А как сделать это в одной транзакции и всё откатить в случае неудачи?

Написать свой менеджер распределенных транзакций как вам и посоветовал Михаил.
two-phase commits - это только маленькая часть корректной реализации этой задачи (правда без нее никуда).

PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого.

PPS: гарантированно синхронные распределенные транзакции не возможны просто потому что мир так неудачно устроен :).

PPPS: Misha Tyurin очень очень хороший и подробный ответ написал.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38059566
DAntonio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

Спасибо большое. Всем спасибо! :)
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38059640
pg locale
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут вам не Оракл!
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38059797
PYO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PYO
Гость
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции.
Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах.

Не проще ли pg_pool II использовать?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38059838
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PYODAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции.
Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах.

Не проще ли pg_pool II использовать?

ага... а он что будет делать если insert на одном из серверов не пройдет? :)

pg_pool 2 Это не про надежность
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38060794
PYO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PYO
Гость
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции.
Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах.
Да, и этот сервер выпадет из пула.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38060798
PYO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PYO
Гость
авторINSERTы в несколько баз данных на разных серверах в рамках одной транзакции
Прошу прощения - внимательно не дочитал.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38060845
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PYODAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции.
Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах.
Да, и этот сервер выпадет из пула.

не в плане критики... а как вы потом этот сервер будете в пул возвращать не останавливая процесс?

особенно если бывает такая сказочная вещь как deadlocks которые на 2х серверах возникнут из 10 а на остальных нет...
а deadlocks штука в общем то неприятная но в некоторых ситуациях 100% неизбежная...
у вас через 10 минут работы в таком режиме останется один сервер :)
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38061093
PYO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PYO
Гость
Maxim BogukPYOпропущено...

Да, и этот сервер выпадет из пула.

не в плане критики... а как вы потом этот сервер будете в пул возвращать не останавливая процесс?

особенно если бывает такая сказочная вещь как deadlocks которые на 2х серверах возникнут из 10 а на остальных нет...
а deadlocks штука в общем то неприятная но в некоторых ситуациях 100% неизбежная...
у вас через 10 минут работы в таком режиме останется один сервер :)

Спасибо. Буду знать.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38076515
Alexey Borovikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAntonio,
мне кажется, Вам может помочь еще такой вариант:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN TRANSACTION;
PERFORM dblink_connect('conn', 'dbname=superdb');
PERFORM FROM dblink_exec('conn', 'begin;');
SELECT * FROM dblink_exec('conn', 'INSERT INTO ...') as res(r text);
....

-- если-что то пошло не так, то
PERFORM dblink_exec('conn', 'rollback;');
ROLLBACK;

-- если все нормально, то
PERFORM dblink_exec('conn', 'end;');
PERFORM dblink_disconnect('conn');
COMMIT;



Конечно, это условная синхронизация, т.к. есть вероятность ошибки на стадии выполнения команды COMMIT во внешней транзакции, например при использовании DEFFERRED констрейнтов.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38080946
Maxim Boguk
PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого.
Штука совершенно тривиальная в реализации и если не устраивают бесплатные реализации J2EE, то можно взять любой оракл.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38080957
DAntonio,

1. Все он поддерживает
2. Вам надо: а) зарегистрировать в ТРАНЗАКЦИОННОМ хранилище всех участников транзакции и айдюк оной (и коммит туда же тут же) б) провести транзакции на нодах в) каждую транзакцию отпрепарить с соответствующим айдюком г) тот факт, что отпрепарено на всех нодах - занести в транзакционное хранилище по отдельности с коммитом на каждую д) закоммитить на всех нодах транзакции. е) грохнуть все даные о транзакциях, собранных на предыдущем этапе. Все
2.1 Восстановление после сбоев: нужен демон восстановления, который перебирает транзакции из хранилища из п. 2.а и смотрит, живы ли они. Если транзакции выполняются, это не его дело, а если нет, то он смотрит, удалось ли отпрепарить всех участников каждой транзакции. Если да, то он обходит и докоммичивает,если нет - откатывает на всех нодах.
3. Реализовывать можно как угодно, пусть и дблинком, хотя получается несколько сексуально.Оптимизации по вкусу; вообще процедура достаточно тормозная - на менеджере транзакций надо сделать 2n+1 коммитов, где n - число нод; так что разумнее всего это все делать пачкой, а не по одной записи.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38081029
Гость_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
некий хрен с горы, опишите как вы будете восстанавливаться если в процессе у вас упадёт ваше "ТРАНЗАКЦИОННОЕ хранилище всех участников транзакции"?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38081072
Гость_0некий хрен с горы, опишите как вы будете восстанавливаться если в процессе у вас упадёт ваше "ТРАНЗАКЦИОННОЕ хранилище всех участников транзакции"?
А что, разве что-то неясно?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38081368
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
некий хрен с горыDAntonio,

1. Все он поддерживает
2. Вам надо: а) зарегистрировать в ТРАНЗАКЦИОННОМ хранилище всех участников транзакции и айдюк оной (и коммит туда же тут же) б) провести транзакции на нодах в) каждую транзакцию отпрепарить с соответствующим айдюком г) тот факт, что отпрепарено на всех нодах - занести в транзакционное хранилище по отдельности с коммитом на каждую д) закоммитить на всех нодах транзакции. е) грохнуть все даные о транзакциях, собранных на предыдущем этапе. Все
2.1 Восстановление после сбоев: нужен демон восстановления, который перебирает транзакции из хранилища из п. 2.а и смотрит, живы ли они. Если транзакции выполняются, это не его дело, а если нет, то он смотрит, удалось ли отпрепарить всех участников каждой транзакции. Если да, то он обходит и докоммичивает,если нет - откатывает на всех нодах.
3. Реализовывать можно как угодно, пусть и дблинком, хотя получается несколько сексуально.Оптимизации по вкусу; вообще процедура достаточно тормозная - на менеджере транзакций надо сделать 2n+1 коммитов, где n - число нод; так что разумнее всего это все делать пачкой, а не по одной записи.

как то так оно и делается на практике...
реально реализовать эту схему надежно - достаточно интересная задача и весьма нетривиальная...
ну и у транзакционного хранилища надо иметь синхронную реплику рядом...
Все это делается но если я не слишком отстал от жизни - готового проверенного решения для PostgreSQL нет.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38081761
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukкак то так оно и делается на практике...
Ну да, как-то так.
Maxim Bogukреально реализовать эту схему надежно - достаточно интересная задача и весьма нетривиальная...
Возьмите исходники JTA

Maxim Bogukну и у транзакционного хранилища надо иметь синхронную реплику рядом...
?

Maxim BogukВсе это делается но если я не слишком отстал от жизни - готового проверенного решения для PostgreSQL нет.
JBoss, Glassfish - вот так вот сходу. Жалоб на то, что они плохо живут с постгресом я не слышал, с ораклом/дерби вообще без проблем, многие даже не понимают, что там внутре на самом деле происходит. В чем проблемы?
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38082211
Пилот Пиркс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Author the new oneJBoss, Glassfish - вот так вот сходу. Жалоб на то, что они плохо живут с постгресом я не слышал, с ораклом/дерби вообще без проблем, многие даже не понимают, что там внутре на самом деле происходит. В чем проблемы?

Добавлю свои 5 копеек.
Если вам не хочется тащить весь J2EE стэк то советую попробовать Bitronix http://docs.codehaus.org/display/BTM/Home и в частности его high performance fork https://github.com/brettwooldridge/bitronix-hp . У нас Bitronix с PostgreSQL вполне хорошо живут. Сотни распределённых транзакций в секунду.

У распределённых транзакций в PostgreSQL есть парочку не очевидных граблей.
Во первых commit prepared ВСЕГДА делает fsync, даже если synchronous commit=off.
Во вторых по времени выполнения commit prepared и prepare transaction занимают вполне существенно, около 2-3 времён обычных коммитов.
Суммарно это всё приводит к тому, что на одну распределённую транзакцию между двумя нодами вам надо 5 fsync-ов. 2 на 2 commit prepared, 2 на 2 prepare transaction и 1 на fsync лога менеджера транзакций :)

Короче я к тому, что по перфомансу распределённые транзакции ударяют весьма заметно, имейте ввиду.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38082232
Пилот Пиркс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukНаписать свой менеджер распределенных транзакций как вам и посоветовал Михаил.
...
PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого.

Transaction Manager-ов для распределённых транзакций есть много open source-ных и вполне надёжных. Нисколько это не стоит. Писать свой точно не стоит, там 100500 маленьких грабелек и стандартов, как надо реагировать на проблемы в разных фазах двухфазного протокола.
...
Рейтинг: 0 / 0
Распределенные транзакции
    #38082723
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Пилот Пиркс]Maxim Boguk Писать свой точно не стоит, там 100500 маленьких грабелек и стандартов, как надо реагировать на проблемы в разных фазах двухфазного протокола.
Я писал свой - из пг в оракл с логом в мыскль, все очень незамысловато. Работало без проблем; разве что все было свое - может, потому на грабли не набрел?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Распределенные транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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