Использование параллельных транзакций.

Ребята, что-то не могу понять по документации.
Используя библиотеку libpq можно ли соединившись с БД выполнять запросы в контекстах разных транзакций?
Многопоточное приложение, может одновременно модифицировать разные таблицы. Как средствами API задать, что один оператор(ы) выполняется в одной транзакции, а второй в другой. И соответственно отслеживать результаты завершения этих транзакций для корректной обработки ошибок?
Множественные соединения не выход....

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

может

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

Может, а как?

Да я субъективно понимаю, что может, однако ни где в документации не могу найти, как средствами АПИ сказать, что запускается новая транзакция, и те операторы, которые я сейчас запущу - должны выплняться в ней.
2 admin. Я имею представление о том, что такое уровень изоляции. Спасибо.
Но вопрос, подробнее звучит именно так:
1. Я соединился с БД средствами API libpq.lib
2. В одном месте программы я выполняю SQL код, который должен быть в рамках 1-й транзакции, с уровнем изоляции... задаваемой мной.
3. В другом месте программы - .... см пункт 2, с поправкой, на то, что там будет 2-я транзакция
4......N см. пункт 3, транзакции 4-N.
Можете ткнуть меня носом в документацию где описано, как это делается на API? Читал оригинал документации на 8.3.7. Даже с учетом того, что не слишком хорошо знаю английский язык - ничего не нашел. Хочу видеть либо пример кода на С либо пояснения, а лучше и то и другое. Кто может дать ссылку/пример?
Как с помощью API создавать новые транзакции к текущему подключению?
Как задавать параметры изоляции новой транзакции?
Как в функциях API указывать транзакцию, в рамках которой должен выполняться SQLкод?

Это ли не транзакция?

BEGIN WORK;
INSERT INTO foo("ID") VALUES(4);
 savepoint sp1;
 
INSERT INTO foo("ID") VALUES(5);
INSERT INTO foo("ID") VALUES(6);
INSERT INTO foo("ID") VALUES(7);
 rollback TO savepoint sp1;
END;
-------------------------
SELECT  "ID" FROM foo;
--  ID
--  4

Так. Еще раз.

Компадре, я что на китайском разговариваю? :-)
Мне. Нужно. Обращаться. К. СУБД. С. Помощью. API - функций. libpq.lib Из программ, написанных на языке С, а не с помощью процедур SQL. Вопрос состоит именно в том, чтобы с помощью поставляемой библиотеки обращаться к БД и иметь возможность с помощью вышеуказанной API-библиотеки создавать множественные / одновременные транзакции. Вот я и хочу выяснить, какие именно функции этой API-библиотеки отвечают за такую возможность.

Вы хотите

Вы хотите сказать что в API нет функций для открытия транзакций? Что-то мне верится с трудом!

транзакция

транзакция открывается на сервере, какая разница, через какое место вы пошлете команду BEGIN...

вот нашел

По умолчанию каждый PQexec считается за отдельную транзакцию, если явно не начать транзакцию с помощью команды BEGIN, которая будет продолжаться либо до COMMIT, либо до ROLLBACK.

вот код

а вот из документации
30.3.1. Main Functions

PQexec
Submits a command to the server and waits for the result.

PGresult *PQexec(PGconn *conn, const char *command);

Returns a PGresult pointer or possibly a null pointer. A non-null pointer will generally be returned except in out-of-memory conditions or serious errors such as inability to send the command to the server. If a null pointer is returned, it should be treated like a PGRES_FATAL_ERROR result. Use PQerrorMessage to get more information about such errors.

It is allowed to include multiple SQL commands (separated by semicolons) in the command string. Multiple queries sent in a single PQexec call are processed in a single transaction, unless there are explicit BEGIN/COMMIT commands included in the query string to divide it into multiple transactions. Note however that the returned PGresult structure describes only the result of the last command executed from the string. Should one of the commands fail, processing of the string stops with it and the returned PGresult describes the error condition.

почитайте еще вот этот раздел 30.17. Behavior in Threaded Programs
да и вообще http://postgresql.ru.net/manual/libpq.html

Мда....

Спасибо. Теперь стало яснее. Я, честно говоря думал, что процесс управления транзакциями будет сделан примерно так же (в смысле так же гибко) как и в FireBird. Ну, что - ж, жалко. Но не смертельно. Выходит, что у каждой СУБД свои недостатки.

Не забывайте

Не забывайте только, что транзация она на то и транзакция, что пока она не завершена - результаты её выполнения не видны другим транзакциям.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023