Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

ADO и транзакции   Найти похожие ветки 

 
truegosha   (2007-01-24 10:36) [0]

Здравствуйте!
Столкнулся с проблемой. Нужно выполнить множество sql команд в одной транзакции. СУБД MSSQL. Если во время выполнения одной из команд произошла ошибка, то нужно откатить все изменения. Но у меня есть серьезные подозрения, что каждое ADOConnection.Execute() выполняется в своей транзакции... Конструкция ADOConnection.Execute("BEGIN TRANSACTION ... ") никак не влияет на поведение ADOConnection. Прога на D6, все настройки компонентов ADO (кроме строки подключения :)) по умолчанию. Вопрос. Как заставить несколько ADOConnection.Execute() выполняться в одной транзакции. Можно было бы в Execute() передать большой скрипт, выполняющий все что надо, но такое решение вызывает опасения...


 
Ega23 ©   (2007-01-24 10:40) [1]

в Execute() передать большой скрипт

В чём опасения-то?


 
sniknik ©   (2007-01-24 10:46) [2]

> Конструкция ADOConnection.Execute("BEGIN TRANSACTION ... ") никак не влияет на поведение ADOConnection
а как оно должно влиять? sql команда выполняется на sql сервере, а ADOConnection это компонента в программе на клиенте.

> Как заставить несколько ADOConnection.Execute() выполняться в одной транзакции
зачем заставлять? и так все так и работает, после указанной sql команды сервер организует транзакцию и все последующее будет выполняться в ней.


 
truegosha   (2007-01-24 11:19) [3]

> В чём опасения-то?

В Execute() не хочу передавать большой скрипт, так как не будет возможности создать толковый лог выполнения.

> sql команда выполняется на sql сервере, а ADOConnection это компонента в программе на клиенте

Извините, неверно выразился. Мне нужно, чтобы на сервере создалась транзакция и все последующие Execute() выполнялись в ней, пока не выполнится COMMIT TRANSACTION, или пока не произойдет ошибка.

> сервер организует транзакцию и все последующее будет выполняться в ней

Так Вы утверждаете, что для каждого Execute() не создается отдельной транзакции? По-моему все же это не так! При возникновении ошибки откатить то, что выполнилось предыдущими Execute() не получается!


 
alex_*** ©   (2007-01-24 11:44) [4]

DM.Connection.BeginTransaction();

cmd1.Execute();
cmd2.Execute();
.....

DM.Connection.Commit();

?


 
sniknik ©   (2007-01-24 12:29) [5]

> Так Вы утверждаете, что для каждого Execute() не создается отдельной транзакции?
вообщето я утверждал немного не это...
по поводу "каждого Execute()". не execute-а, это тоже метод клиентской компоненты, а любой sql команды их действительно сервер "обертывает" в неявную транзакцию, если она не задана явно. ну и потом, они могут быть вложенные - транзакция верхнего уровня откатит все в нее вложенные, правда тогда она должна быть именованная иначе нет возможности обратится "через голову" другой.

> По-моему все же это не так!
не терзайся сомнениями. проверь. это очень легко сделать. (3 команды, стартовать, выполнить, откатить... и посмотреть откатилось или нет)

> При возникновении ошибки откатить то, что выполнилось предыдущими Execute() не получается!
у тебя ошибка в программе

alex_*** ©   (24.01.07 11:44) [4]
вообщето без разницы, если есть возможность это будет переведено в теже запросы (можеш посмотреть профайлером).
предпочитаю делать запросами. явно.



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.054 c
15-1174326484
raqy.style
2007-03-19 20:48
2007.04.15
Удаленная MySql и Delphi 7


15-1174296854
Jolik
2007-03-19 12:34
2007.04.15
Delphi for PHP


3-1169551985
vl
2007-01-23 14:33
2007.04.15
Добавление данных в таблицу


1-1170303300
APiC
2007-02-01 07:15
2007.04.15
реестр


15-1174302327
vajo
2007-03-19 14:05
2007.04.15
Total Commander