Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не выполняется весь набор операций в транзакции [D7, MSSQL]


Страницы:   1 2 3

elshad_s ©   (2003-12-17 17:34:00) 

Например есть такой отрывок текста программы:

TADOConnection.BeginTrans;
try
{Операция_1,
Операция_2,
Операция_3}
TADOConnection.CommitTrans;
except
------

Под "Операция_1,2,3" подразумевается добавление записей в таблицы T1, T2 и T3 соответственно.

Проблема в том что, после TADOConnection.CommitTrans только итог "Операция_3" вностися в Базу данных (в таблицу T3) а результаты предыдущих операций игнорируются. То есть Commit действует только на последнюю операцию.

СУБД - SQL Server Desktop Edition
Провайдер - Microsoft OLE DB Provider for SQL Server

P.S. В Access 97 все работает нормально:)


JibSkeart   (2003-12-18 14:10:00) [21]

А вообще я что то не вижу смысла за ключать все это в
begin trans
commit tran
может просто уберешь их пока да посмотри что получается


Nikolay M.   (2003-12-18 14:09:00) [22]

Попробуй на время отказаться от функций:

with Query_Save do
begin
Connection := TADOConnection;
Sql.Clear;
Sql.Add("INSERT INTO T1 (iint) Values (3)");
ExecSQL;

Sql.Clear;
Sql.Add("INSERT INTO T2 (code) Values ( 4)");
ExecSQL;

Sql.Clear;
Sql.Add("INSERT INTO T3 (code) Values ( 5)");
ExecSQL;
end;


И каков смысл в строке
Connection := TADOConnection;
?


elshad_s   (2003-12-18 14:05:00) [23]

To iSestrin

>>Все-таки, почему бы не поместить весь серверный код в хранимую
>>процедуру и вызывать только ее?

Дак прога же многоплатформенная...


AAron   (2003-12-18 14:01:00) [24]

Привет.

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

Все остальные кивки на версию SQL Server и т.п. можно не обращать внимания (пока).


elshad_s   (2003-12-18 14:00:00) [25]

sniknik

>>попробуй всетаки мой вариант

Так это не как не подходит. Дело в том что, итог каждого INSERT"а влияет на то, что будет добавлена в следующем INSERT"е.

И вообще не может такого быть что бы, то что можно делать на Access"е не возможно было сделать на SQL Server"е!!!

To JibSkeart

>>да и необязательно реконект
>>явно гдето есть ошибка
>>и если есть хоть одна ошибка ,
>>то все что заключенно в
>>Begin trans
>>commit trans
>>не выполница тоесть произойдет откат

Да. Ты прав. Но проблема то и в том что, откат не происходит. В результате в базе имеем итог "Операция_3"(последная операция). А итоги предедущих операций игнорируются.

>>так что лутьше бы вы elshad_s
>>показали полный код что происходит
>>сдесь у вас

Более менее полный текст приведен на elshad_s © (18.12.03 11:03) [8]

To Silver Alex

>>А если попробовать все это выполнить в хранимой процедуре?

Хранимые процедуры не как не подходят так как программа многоплатформенная то есть должна работать на Access, SQL Server (а будушем:) и на Oracle)

Может вообше не с того конца беремся... Дело не в Delphi, не на коде а в настройках сервера или в параметрах...


iSestrin   (2003-12-18 13:50:00) [26]

Все-таки, почему бы не поместить весь серверный код в хранимую процедуру и вызывать только ее?

судя по описанию:

>но дело в том что, в моем конкретном случае нет возможности обьединения операций в одну комманду. Так как, то что добавляется в "Операция_2" зависит от результата предыдущей операции. По этому в блоке команд транзакции с начала выполняется INSERT Query(Операция_1), потом идут вычисления, а после уже идет 2-ой INSERT Query(Операция_2) и тд.<

все прекрасно укладывается в одну процедуру.
серверу - серверово, клиенту - клиентово!


MOA   (2003-12-18 13:32:00) [27]

Посмотрите всё-таки в Profiler, какие именно команды идут на сервер. Особенно обратите внимание - не создаётся ли дополнительный коннект(ы).
Удачи!


JibSkeart   (2003-12-18 13:26:00) [28]

Это кстати тоже вариант.


Silver Alex   (2003-12-18 13:25:00) [29]

очень странно все это. А если попробовать все это выполнить в хранимой процедуре?


JibSkeart   (2003-12-18 13:17:00) [30]

да и необязательно реконект
явно гдето есть ошибка
и если есть хоть одна ошибка ,
то все что заключенно в
Begin trans
commit trans
не выполница тоесть произойдет откат

так что лутьше бы вы elshad_s
показали полный код что происходит
сдесь у вас
TADOConnection.BeginTrans;
try
{Операция_1,
Операция_2,
Операция_3}
TADOConnection.CommitTrans;
except


sniknik   (2003-12-18 13:13:00) [31]

попробуй всетаки мой вариант > sniknik © (17.12.03 17:41) [1]
(понимаю тебе так не пойдет, но попробуй)
а после того как так сработает,
подели на отдельные команды... желательно без извращений по минимуму, лутще всего 2 компонента на форме ADOConnection и ADOCommand
если и это сработает,
смотри что происходит на твоих запросах (вернее между ними), наверняка чтото случается вроде реконекта и т.д...


JibSkeart   (2003-12-18 13:09:00) [32]

а смысл подобной операции ?
насколко я помню ,
MSSQL сам решит как ему лутьше обьеденить все это.


elshad_s   (2003-12-18 12:46:00) [33]

To KSergey

>>Не, дело не в версии и не в редакции сервера.
>>Тут что-то наверное не то.

Я тоже так думаю. Так как в резултате данной проблемы про использовании транзакции можно забыть:( А такого не может быть что бы в SQL Server"е даже в какой то версии или редакции не было возможности полноценно пользоваться транзакциями.

>>А Sql - это что за компонент? А если вместо него использовать

А SQL это не компонента если ты судишь по отрывку из текста программы... Это свойство компоненты TADOQuery.

To Nikolay M.

>>кстати, почему TADOConnection?),

TADOConnection это просто мое лишнее желание представить его в смысле компоненты... Естественно что это в реале написано ИмяКомпоненты.BeginTrans;

>>а стартовать транзакцию руками первой командой:
>>Sql.Add("BEGIN TRANS");

И это проверял... вместо ADOConnection.BeginTrans писал Sql.Add("BEGIN TRANS"), а вместо ADOConnection.CommitTrans соответсвенно Sql.Add("COMMIT TRANS"). Результат был нулевым:(
А в самих операций(то есть перед и после INSERT"а) стартовать и коммитировать транзакцию нельзя потому что, все 3 операции это логическое единое целое. Транзакцию нужно стартовать в самом начале и кончать в самом конце.


Nikolay M.   (2003-12-18 12:16:00) [34]

А если пошаманить: делать не TADOConnection.BeginTrans (кстати, почему T ADOConnection?), а стартовать транзакцию руками первой командой:
Sql.Add("BEGIN TRANS");
?


KSergey   (2003-12-18 12:00:00) [35]

Не, дело не в версии и не в редакции сервера.
Тут что-то наверное не то.

А Sql - это что за компонент? А если вместо него использовать

ADOConnection.Execute(..), где использовать именно тот же ADOConnection, что и используется для транзакций?


elshad_s   (2003-12-18 11:24:00) [36]

То Scrooge

>>Такая же проблема была на MSSQL 7.0. Как лечить - не знаю,
>>пришлось обходить, на 2000-м проблема исчезла. ИМХО дело в СУБД

на 2000-м в смысле на SQL 2000? Если да то в каком edition"е?


Scrooge   (2003-12-18 11:14:00) [37]

Такая же проблема была на MSSQL 7.0. Как лечить - не знаю, пришлось обходить, на 2000-м проблема исчезла.
ИМХО дело в СУБД.


elshad_s   (2003-12-18 11:03:00) [38]

To Silver Alex

>>ну а @RETURN_VALUE что возвращает?если не 0 значит чего то >>там не сложилось.Попробуй вообще убрать транзакцию, что >>будет.Посмотри или в самих хранимых процедурах нет >>транзакций. Надо вобщем локализовать ошибку

Ну я же говорил... после каждой операции я использую результат. По этому если бы проблема была в самой операции, то последующее вычисление это выявило бы. А транзакцию убрать тоже проверял и все работает нормально. А хранимыми процедурами не пользуюсь.
Вот примерный текст программы

---------------------------------------------------------------- TADOConnection.BeginTrans;
try
Case MainForm.ActiveMDIChild.Tag of
23 : for_kod.Save;
......
......
......
end;
TADOConnection.CommitTrans;
except
TADOConnection.RollbackTrans;
raise;
end;
.....

procedure Tfor_kod.Save;
function myCalcFunc1 : String;
begin
Result := "Резальтат вычислений с добавленным значением поля iint в таблице T1"
end;
function myCalcFunc2 : String;
begin
Result := "Резальтат вычислений с добавленным значением поля code в таблице T2"
end;
begin
with Query_Save do
begin
Connection := TADOConnection;
Sql.Clear;
Sql.Add("INSERT INTO T1 (iint) Values (3)");
ExecSQL;

Sql.Clear;
Sql.Add("INSERT INTO T2 (code) Values (" + #39 + myCalcFunc1 + #39 + ")");
ExecSQL;

Sql.Clear;
Sql.Add("INSERT INTO T3 (code) Values (" + #39 + myCalcFunc2 + #39 + ")");
ExecSQL;
end;
end;
----------------------------------------------------------------

Вообше то я думаю может это проблема в самом СУБД, так как в Access"е проблем нет. Может это из за того, что у меня SQL Server Desktop Edition...


Silver Alex   (2003-12-18 09:20:00) [39]

ну а @RETURN_VALUE что возвращает?если не 0 значит чего то там не сложилось.Попробуй вообще убрать транзакцию, что будет.Посмотри или в самих хранимых процедурах нет транзакций. Надо вобщем локализовать ошибку


Shirson   (2003-12-18 08:30:00) [40]

Может, между операциями GOпоставить?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо