Форум: "Базы";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 1.239 c