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 все работает нормально:)


KSergey   (2003-12-19 08:46:00) [1]

Я никак не пойму автора: ему дают всякие рекомендации, задают дополнительные вопросы, а он вот уперся "я все написал" - и все тут!
Где ответы на мои вопросы (которые уточняющие??)

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

А вот "ADOConnection.Execute(..), где использовать именно тот же ADOConnection, что и используется для транзакций?" - это уже вопрос.
Так же вопрос, заданный в личной переписке "А эти Query точно подключены к этому TADOConnection?" - аналогично, без ответа. Ни в письме я ответа ни прочитал, ни на форуме.

Такое впечатление, что для вас важно, чтобы внимание обратили. А не решение проблемы.

Еще, обратите внимание на св-ство ADOConnection.KeepConnection, которое должно стоять в True.
Иначе, возможно, между командами соединение действительно рвется.

Короче, давайте уже ответы, а не общие рассуждения.

И еще не понравилось ваше замечание насчет "кросплатформенности" - что-то не сильно ли это круто? Есть ли в том смысл?


mikali   (2003-12-19 06:38:00) [2]

Результаты профайлера - в студию ! Сколько просить-то ?


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


> используя его(это соединение) можно получить в SELECT"е
> добавленную запись

На самом деле его можно получить и в другом коннекте через
SELECT * FROM table ( nolock)
Если по F8 проходить последовательно каждый инсерт, то что говорит такой запрос - добавляются ли записи до коммита, непосредственно сразу после вставки?
Возможно, проблема именно с коммитом транзакции? Место на винте закончилось, transaction log стал очень большой или еще что-то?
Структуру таблиц какая?
Может действительно какие-то траблы с identity внутри транзакции?


elshad_s   (2003-12-18 16:50:00) [4]

To Александр Иванов

>>У меня создается впечатление, что после отправки первых
>>запросов не фиксируется транзакция и соответственно невозможно
>>селектом получить подтверждение добавления записи. Т.к.
>>реальное добавление записи произойдет после фиксирования
>>командой commit

Это вовсе не так. Пока соединение в котором происходит транзакция не прерывается, используя его(это соединение) можно получить в SELECT"е добавленную запись и до commit"а а после него оно исчезает


Александр Иванов   (2003-12-18 16:17:00) [5]

У меня создается впечатление, что после отправки первых запросов не фиксируется транзакция и соответственно невозможно селектом получить подтверждение добавления записи. Т.к. реальное добавление записи произойдет после фиксирования командой commit.


Александр Иванов   (2003-12-18 16:17:00) [6]

У меня создается впечатление, что после отправки первых запросов не фиксируется транзакция и соответственно невозможно селектом получить подтверждение добавления записи. Т.к. реальное добавление записи произойдет после фиксирования командой commit.


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

проверил в профайлере.., в обшем, есть различия старта транзакции при такой записи
ADOConnection1.BeginTrans;
и
при такой к примеру
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("BEGIN TRANSACTION");
ADOQuery1.ExecSQL;

(и правильно что я первым вариантом не пользуюсь ;о)))
и с завершением по другому но правильней наверное (буду так делать)
IF @@TRANCOUNT > 0 COMMIT TRANSACTION


Dankov   (2003-12-18 15:28:00) [8]

Попробуй сделать следующее:

ADOConnection1.Properties.Item["Multiple connections"].Value:=False;

это надо сделать сразу же после ADOConnection1.Connected := True;


elshad_s   (2003-12-18 15:19:00) [9]

To Nikolay M.

>>Веришь-нет: у меня прекрасно все работает. Различие у нас с
>>тобой только в одной строке:
>>
>>dmMain.ADOConnection1.Connected := True;

Ну это естественно... Я это делал в дизайн-тайме:) И в свойство ADOQuery.Connection выбрал ADOConnection1;


sniknik   (2003-12-18 15:16:00) [10]

> Все что я могу сделать это дать тебе кусок тестового проекта:
давно бы так.
хочеш сказать что вот это у тебя не работает? запись только в ADT.per_code ложится? а в PRK нет.
если так то :(( дело плохо. у меня работает.

единственное отличие что сделал это в таблицы (с теми же именами) добавил ключевое поле (у тебя оно есть? должно быть).

и ты не написал значение (важнного по моему) параметра ADOConnection1.KeepConnection (по умолчанию вроде true стоит).


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

В Query Analyzer"е проверил:

Begin Transaction

INSERT INTO PRK (Kod, Ad, SAd, AAd) VALUES ("001", "ААА", "БББ", "ССС")
INSERT INTO ADT (per_code) VALUES ("001")

Commit Transaction

Здесь проблем нет:(
А вот если то же самое проделовать в проге, запись видна толко в таблице ADT!!!
Может что то есть в TADOConnection"е???


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

Веришь-нет: у меня прекрасно все работает. Различие у нас с тобой только в одной строке:

dmMain.ADOConnection1.Connected := True;
dmMain.ADOConnection1.BeginTrans;
dmMain.q.SQL.Text := "INSERT INTO UpdateTest (val) VALUES (1)";
dmMain.q.ExecSQL;
dmMain.q.SQL.Text := "INSERT INTO UpdateTest (val) VALUES (2)";
dmMain.q.ExecSQL;
dmMain.q.SQL.Text := "INSERT INTO UpdateTest (val) VALUES (3)";
dmMain.q.ExecSQL;
dmMain.ADOConnection1.CommitTrans;


MOA   (2003-12-18 15:08:00) [13]

Ну посмотрите же наконец профайлером, что идёт на сервер!


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

To Nikolay M.

>>А транзакция-то вообще стартует? InTransaction после
>>BeginTrans равно True? И что возвращает BeginTrans?

После BeginTrans InTransaction = True
После "Операция_1" InTransaction = True
После "Операция_2" InTransaction = True
После "Операция_3" InTransaction = True
После CommitTrans InTransaction = False


Nikolay M.   (2003-12-18 14:56:00) [15]

А транзакция-то вообще стартует? InTransaction после BeginTrans равно True? И что возвращает BeginTrans?


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

To sniknik

Во первых спасибо за доброту:))) Что ты хочешь вместо меня решить проблему:))

Но у тебя условие что я должень сказать тебе как сделать и у тебя такой же глюк. Но это по моему мне не по силам:)
Все что я могу сделать это дать тебе кусок тестового проекта:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.BeginTrans;
try
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add("INSERT INTO PRK (Kod, Ad, SAd, AAd)");
SQL.Add("VALUES (" + #39 + Edit1.Text + #39 + ",");
SQL.Add(#39 + Edit2.Text + #39 + ",");
SQL.Add(#39 + Edit3.Text + #39 + ",");
SQL.Add(#39 + Edit4.Text + #39 + ")");
ExecSQL;

SQL.Clear;
SQL.Add("INSERT INTO ADT (per_code)");
SQL.Add("VALUES (" + #39 + Edit1.Text + #39 + ")");
ExecSQL;
end;

ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
raise;
end;

end;

end.


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

СУБД наверное уже знаеш какое... Не какие настройки не трогал. Устонавливал по схеме "Netx, Next, ... Finish"

ADOConnection соеденен через UDL файл.
Провайдер - Microsoft OLE DB Provider for SQL Server

>>проверь
>>функции first, last, mid, sdate, dateserial......т.д.
>>линковка таблиц....
>>у самого аксеса формы, программирование интерфейса...
>>...
>>т.д.

И ты думаеш что мне сейчас есть дело до каких то first, линковка, програмирование интерфейса.. и т.д.
Когда я говорил "И вообще не может такого быть что бы, то что можно делать на Access"е не возможно было сделать на SQL
Server"е!!!" я имел ввиду нечего кроме транзакции.


ua-soft   (2003-12-18 14:31:00) [17]

Наиболее вероятный вариант, что проблемы находятся не на клиенте, а на сервере. Вы уверены, что Ваши SQL-команды выполняются без ошибок? Дело в том, что по умолчанию SQL-сервер комитит каждый SQL-оператор, который выполнился успешно, и откатывает операторы, при выполнении которого произошли ошибки. В приложение Вы получите результат выполнения последнего выполненого оператора, т.е. если где-то (например, в триггере) произошла ошибка (данные в таблицу не вставятся) - Вы об этом и не узнаете никогда. Проверте Ваши SQL-утверждения в средстве, которое позволяет проводить отладку и диагностику SQL...


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

> И вообще не может такого быть что бы, то что можно делать на Access"е не возможно было сделать на SQL
> Server"е!!!
проверь
функции first, last, mid, sdate, dateserial......т.д.
линковка таблиц....
у самого аксеса формы, программирование интерфейса...
...
т.д.


sniknik   (2003-12-18 14:20:00) [19]

elshad_s © (18.12.03 14:00) [21]
> sniknik
> >>попробуй всетаки мой вариант
> Так это не как не подходит. Дело в том что, итог каждого INSERT"а влияет на то, что будет добавлена в следующем
> INSERT"е.

я тебе не предлагаю менять программу а предлагаю методику(как сказано а ;о)) тестирования. чтобы знать где глюк. тебе чего на форму нового проэкта пару компонентов кинуть лень? и по кнопке 2 раза код переписать и выполнить?

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

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


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

возьми для чистоты эксперимента создай новый проект, положи на него TADOConnection, TADOQuery и также в транзакции просто вставь в те же таблички какие-нибудь записи.Посмотри что получится. И код бы глянуть полностью.


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

Наверх

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