![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не выполняется весь набор операций в транзакции [D7, MSSQL]
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поставить?