Запрос с работой транзакции

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
zenum
Сообщения: 5
Зарегистрирован: 01 мар 2005, 14:29

Запрос с работой транзакции

Сообщение zenum » 28 фев 2006, 11:47

Привет,
Мне нужно организовать проверку выполнения команд в транзакции, вида:

start transaction
update mytable set oklad=oklad+1000
update mytab set nalog=nalog+(nalog/0.03)
........
.........
if ошибка then rollback else commit

-------------
В общем мне нужен вид запроса проверки на ошибку и откат данных или применение, типа:
if error<>0 then .....

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 фев 2006, 14:29

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

Код: Выделить всё

TR.StartTransaction
try
  SQL1.ExecQuery;
  SQL2.ExecQuery;
except
   TR.Rollback;
end.
if TR.Active then TR.Commit;
если оба запроса загнать в процедуру, то и обрабатывать ничего не надо. При обломе на любом операторе внутри процедуры автоматически отменится все, что успело выполниться в процедуре.

aXis
Сообщения: 4
Зарегистрирован: 01 сен 2006, 05:11

Сообщение aXis » 01 сен 2006, 05:13

тогда зачем нуже
SET TRANSACTION?
Да и облом может быть разный
ожидаемый трабл какой нить. например ну нет такой записи

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 01 сен 2006, 12:25

aXis писал(а):тогда зачем нуже
SET TRANSACTION?
А это что за зверь?
aXis писал(а):Да и облом может быть разный
ожидаемый трабл какой нить. например ну нет такой записи
Разный облом и проверяется по-разному, там же в блоке exception нужно разбить на варианты обработки.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 сен 2006, 12:55

тогда зачем нуже
SET TRANSACTION?
это, грубо говоря, оператор ISQL. или embedded SQL. В сервере его нет.
ожидаемый трабл какой нить. например ну нет такой записи
нет записи - проверяется по rowsaffected например. да и сам датасет это и проверяет, и выдает ошибку уже не серверную, а клиентскую.
В общем, разберись с исключениями в Pascal :-)
Последний раз редактировалось kdv 01 сен 2006, 12:57, всего редактировалось 1 раз.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 сен 2006, 12:56

aXis писал(а):тогда зачем нуже SET TRANSACTION?
http://www.ibase.ru/devinfo/ibtrans.htm
Вырезка из статьи:
Как вы поняли, это синтаксис Embedded SQL. Т.е. "запихнуть" такой оператор в компонент Query не получится. Однако объяснять такой синтаксис проще, чем набор сухих констант из API Guide. Поэтому объяснение синтаксиса пойдет параллельно с константами.
aXis писал(а):Да и облом может быть разный
ожидаемый трабл какой нить. например ну нет такой записи
Для этого есть механизм пользовательских исключений, а также механизм событий.
В общем, идите и читайте книжки.

aXis
Сообщения: 4
Зарегистрирован: 01 сен 2006, 05:11

Сообщение aXis » 01 сен 2006, 13:28

kdv писал(а):
тогда зачем нуже
SET TRANSACTION?
это, грубо говоря, оператор ISQL. или embedded SQL. В сервере его нет.
ожидаемый трабл какой нить. например ну нет такой записи
нет записи - проверяется по rowsaffected например. да и сам датасет это и проверяет, и выдает ошибку уже не серверную, а клиентскую.
В общем, разберись с исключениями в Pascal :-)
язык c#. использую ado.net. причем тут еще какой то датасет.
делфи увы не знаю.

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

Как вы поняли, это синтаксис Embedded SQL. Т.е. "запихнуть" такой оператор в компонент Query не получится. Однако объяснять такой синтаксис проще, чем набор сухих констант из API Guide. Поэтому объяснение синтаксиса пойдет параллельно с константами.
а зачем тогда и в ibx и в ems в подсказке есть слово TTRANSACTION?
если в них запихнуть нельзя?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 сен 2006, 13:45

aXis писал(а):язык c#. использую ado.net. причем тут еще какой то датасет.
Ну как какой. Класс таблицы данных в Delphi. В FW 1.1 к нему наиболее близок DataTable.

P.S. Просьба цитировать не весь пост, а конкретные фразы, на которые отвечаешь.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 сен 2006, 13:45

aXis писал(а): а зачем тогда и в ibx и в ems в подсказке есть слово TTRANSACTION?
если в них запихнуть нельзя?
Ты знаешь, на свете есть очень много предметов, в которые нельзя запихнуть. Начиная прямо с того, который ищешь куда бы запихнуть. Однако, согласись, что он тоже небесполезный :-D

aXis
Сообщения: 4
Зарегистрирован: 01 сен 2006, 05:11

Сообщение aXis » 01 сен 2006, 14:28

Ну как какой. Класс таблицы данных в Delphi. В FW 1.1 к нему наиболее близок DataTable.
я просто хочу вызвать хранимую процедуру с параметрами. И зачем мне создавать dataset или тем более datatable. FW 2

в адо.нет есть 2 варианта такой работы ( пример mssql)
1) как обычно сделать процедуру

Код: Выделить всё

create proc name ....
as
...
Start transaction
...
if(...) then commit
else
rollback
2) на уровне клиента

Код: Выделить всё

FbConnection con=new FbConnection();
FbTransaction tran=con.BeginTransaction();
Fbcommand cmd=new Fbcommand(query);
...
cmd.Transaction=tran;
try{
    cmd.ExecuteNonQuery();
    tran.Commit();
}
catch(FbException){
   tran.Rollback();
}
в самой процедуре чуть что выкидвать исключения.
в firebird видимо 1 вариант нереален. только второй


ну а что делать если реально процедура заумная и нужно несколько раз бы сделать commit внутри ее?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 01 сен 2006, 14:39

Разбить на несколько и коммитить после каждой.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 сен 2006, 14:58

1. Начиная с FB 1.5, появились savepoints. Что это такое, ищи на сайте.
2. В FB транзакциями управляет только клиентская часть. Поэтому ХП уже отпадает.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 сен 2006, 15:06

просто в mssql этого вопроса как то не возникало.
выкинь из головы это.
в IB/FB транзакцию стартует только клиент, и он же решает как ее завершить, и когда.
датасеты пофиг - чего хочешь, то и делай.

aXis
Сообщения: 4
Зарегистрирован: 01 сен 2006, 05:11

Сообщение aXis » 01 сен 2006, 16:13

во всем разобрался. Всем огромное спасибо.

Ответить