![]() |
| ||
|
|
Новости |
Поиск |
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 все работает нормально:)
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 и также в транзакции просто вставь в те же таблички какие-нибудь записи.Посмотри что получится. И код бы глянуть полностью.