Страница 1 из 1

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

Добавлено: 28 фев 2006, 11:47
zenum
Привет,
Мне нужно организовать проверку выполнения команд в транзакции, вида:

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 .....

Добавлено: 28 фев 2006, 14:29
kdv
непонятно, в чем проблема. если ты хочешь сделать это на сервере, то это неправильно - транзакции стартуют и завершаются клиентом.

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

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

Добавлено: 01 сен 2006, 05:13
aXis
тогда зачем нуже
SET TRANSACTION?
Да и облом может быть разный
ожидаемый трабл какой нить. например ну нет такой записи

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

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

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

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

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

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

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

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

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

Добавлено: 01 сен 2006, 14:28
aXis
Ну как какой. Класс таблицы данных в 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 внутри ее?

Добавлено: 01 сен 2006, 14:39
Dimitry Sibiryakov
Разбить на несколько и коммитить после каждой.

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

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

Добавлено: 01 сен 2006, 16:13
aXis
во всем разобрался. Всем огромное спасибо.