Страница 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?
если в них запихнуть нельзя?
Ты знаешь, на свете есть очень много предметов, в которые нельзя запихнуть. Начиная прямо с того, который ищешь куда бы запихнуть. Однако, согласись, что он тоже небесполезный

Добавлено: 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
во всем разобрался. Всем огромное спасибо.