powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно как-то узнать, что транзакция была начата словом begin?
13 сообщений из 13, страница 1 из 1
Можно как-то узнать, что транзакция была начата словом begin?
    #33199926
vvv123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например:

begin;
insert into....

Как в этом месте можно узнать, что перед insert был begin?
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33200766
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транзакция в SQL всегда начинается с BEGIN. А зачем это тебе?
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33200812
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманТранзакция в SQL всегда начинается с BEGIN.В PostgreSQL - не всегда.

http://www.postgresql.org/docs/8.0/static/sql-begin.html

By default (without BEGIN), PostgreSQL executes transactions in "autocommit" mode, that is, each statement is executed in its own transaction and a commit is implicitly performed at the end of the statement (if execution was successful, otherwise a rollback is done).
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33200860
vvv123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин РоманА зачем это тебе?
Мне досталась в наследство клиентская прога, достаточно коряво написанная, разбираться с ней некогда, надо заставить работать хоть как-то.
Там может случиться некая лажа, что если какие-то данные вставляются с указанием
begin
insert.... - и вот если insert идёт достаточно долго, то в принципе есть возможность, нажав пару кнопок вставить ещё кое-чего ненужного. Я даже знаю людей, у которых это получается (у меня никак). В принципе, можно в клиенте кое-как поправить, но получится ещё более коряво. Я надеялся, что как-то по-научному это сделать
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33202944
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При вставке номер оператора внутри транзакции можно узнать косвенным путем - по значению системной колонки cmin, но и то - только начиная со втогого insert-а:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table tt (i int);
insert into tt values ( 1 );
insert into tt values ( 2 );
begin;
insert into tt values ( 3 );
insert into tt values ( 4 );
insert into tt values ( 5 );
commit;
select i, cmin, cmax from tt order by  1 ;
Код: plaintext
1.
2.
3.
4.
5.
6.
i	cmin	cmax
1	0	0
2	0	0
3	0	0
4	1	0
5	2	0

В функции на C можно наверняка получить доступ ко всей внутренней информации, но для этого в исходниках разбираться надо...
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33207691
vvv123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эх, ладно, тогда я сейчас буду бестолковые вопросы задавать, а меня все будут за это посылать известно куда. А я там был, и ничего не нашёл по теме.

Как запретить ИМЕННО МНЕ вносить изменения в таблицу, пока не выполнен commit ?

Ситуация такая:

Есть таблицы: table1, table2, table3

На table1 - table1trigger, c примерным текстом:

Код: plaintext
1.
2.
3.
4.
5.
if new.user_id is not null then
   for r in select * from table2 where user_id=new.user_id 
   loop 
       insert into table3 (item_count) values(r.item_count)
   end loop;
end if;

В клиентской проге 2 процедуры:

При нажатии F2:
Код: plaintext
   update table2 set item_count=:count + item_count

При нажатии F1: (после этого срабатывает наш замечательный триггер)
Код: plaintext
1.
2.
3.
   begin;
   update table1 set user_id=:user where user_id is null
   commit;
Я не очень понимаю такой ситуации:
После нажатия F1, когда уже в триггере пошло обновление table3,
если обновление идёт достаточно долго,
что случится, если пользователь нажмёт несколько раз кнопку F2?

Я так думаю, что после работы table1trigger, обновится table2, что мне совсем не надо. Чего делать?
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33209412
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vvv123
Я не очень понимаю такой ситуации:
После нажатия F1, когда уже в триггере пошло обновление table3,
если обновление идёт достаточно долго,
что случится, если пользователь нажмёт несколько раз кнопку F2?
Лучше переписать клиента - дисэйблить F2, пока не отработает F1. Но странно, что "кривой" клиент умеет выдавать асинхронные запросы - обычно начинающие используют синхронные вызовы в одном потоке, где таких проблем возникнуть не может в принципе.

Если клиент уж слишком кривой - можно блокировать всю table2 на всё время транзакции (LOCK TABLE table1 после begin).

К слову, вот этот кусок триггера:
vvv123
Код: plaintext
1.
2.
3.
4.
5.
if new.user_id is not null then
   for r in select * from table2 where user_id=new.user_id 
   loop 
       insert into table3 (item_count) values(r.item_count)
   end loop;
end if;

можно написать без цикла:
Код: plaintext
1.
2.
3.
4.
5.
if new.user_id is not null then
  insert into table3 (item_count) 
    select item_count
    from table2 
    where user_id=new.user_id 
end if;
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33695066
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему, но немного в другом ключе.
Т.к. я ораклист, то никогда не задумывался о начале транзакции. Теперь же прежде чем сделать инсерт (или вызвать процедуру, которая это делает) нужно либо запустить транзакцию, либо, если она уже запущена, ничего не делать. В том случае, если мне нужно именно блок операций выполнить.
Есть возможность определить - транзакция уже начата или еще нет?

PS. Вообще-то понятно, что транзакциями будет управлять приложение, но все равно было бы удобно увидеть - начата ли транзакция.
Приложение - скрипты PHP. Вызываемая функция может не знать, что наколбасила вызывающая. А взывающая после отработки вызываемой хотела бы знать - коммититься или ничего не было.
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33695949
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirПодниму тему, но немного в другом ключе.
Т.к. я ораклист, то никогда не задумывался о начале транзакции. Теперь же прежде чем сделать инсерт (или вызвать процедуру, которая это делает) нужно либо запустить транзакцию, либо, если она уже запущена, ничего не делать.Наверное можно безусловно делать BEGIN, ошибки это вызвать не должно.

Issuing BEGIN when already inside a transaction block will provoke a warning message. The state of the transaction is not affected.

pamirPS. Вообще-то понятно, что транзакциями будет управлять приложение, но все равно было бы удобно увидеть - начата ли транзакция.
Приложение - скрипты PHP. Вызываемая функция может не знать, что наколбасила вызывающая.Вроде бы это задача вызывающей функции (или приложения) открывать и закрывать транзакции. Мы в основном работаем с базой из перла через модуль (обертку DBI) в котором connect делается с параметром AutoCommit=>0. То есть постгресовый режим AutoCommit не используем, а работа происходит а-ля оракл. Вызываем DBI::do("insert..."), DBI::do("..."), DBI::commit(), при этом последовательно вызываются постгресовые команды COMMIT, BEGIN, то есть закрывается текущая транзакция и открывается новая. Может быть аналогично можно сделать в ПХП.

pamirА взывающая после отработки вызываемой хотела бы знать - коммититься или ничего не было.Это уже совсем другой вопрос. Как из функции вернуть статус? (Если я правильно понимаю.) Это по-моему много обсуждалось на форуме. (Я с функциями почти не сталкивался.)
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33697007
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatпри этом последовательно вызываются постгресовые команды COMMIT, BEGIN, то есть закрывается текущая транзакция и открывается новая
Интересная мысль - получаем как в оракле - всегда есть начатая транзакция. Удобно.
Что об этом скажут гуру Постргеса? Это нормальная практика? Я бы принял ее на вооружение.
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33697551
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamir LeXa NalBatпри этом последовательно вызываются постгресовые команды COMMIT, BEGIN, то есть закрывается текущая транзакция и открывается новаяИнтересная мысль - получаем как в оракле - всегда есть начатая транзакция.Да, именно так. Причем это обеспечивает перловый модуль DBI, вместе с DBD::Pg. (При флажке DBI::AutoCommit=0.)

P.S.: Мы тоже с оракла переехали на постгрес.
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33697629
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat
P.S.: Мы тоже с оракла переехали на постгрес.
А я не переезжаю :) Я работаю на оракле, а постгрес изучаю для себя, для души. Как и PHP :)
...
Рейтинг: 0 / 0
Можно как-то узнать, что транзакция была начата словом begin?
    #33698095
-me-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. По поводу состояния транзакции: в libpq есть функция PQtransactionStatus , есть ли связка к ней из PHP - ахез.
(imho) 2. по поводу для души - PostgreSQL rules, PHP sucks, Ruby is better! :) (тяпничный йуморъ)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно как-то узнать, что транзакция была начата словом begin?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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