Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не происходит реального отката при Rollback'е (

15K
21 апреля 2008 года
nevi
35 / / 13.05.2007
на форме разбросаны кмпоненты типа DBEdit DBLookupComboBox и пр. при выборе записи показываю форму через Show(), одновременно открывая транзакцию, в моем понимании - то, что изменено в БД в рамках транзакции должно быть подтверждено коммитом, либо отменено роллбэком, но изменения остаются в базе в любом случае.(
Возможно я не правильно применяю этот инструмент, прошу помочь разобраться.

вот то, что в форме с ДБЕдитами:

Код:
//---------------------------------------------------------------------------
void __fastcall TFormCompDetail::dsmShow(TObject *Sender)
{
        int trlev;
        if(DataModule2->ADOConnection1->InTransaction==false)
        {
                trlev=DataModule2->ADOConnection1->BeginTrans();
                //ShowMessage(IntToStr(trlev));
        }
        else
                ShowMessage("begin transaction error");
}
//---------------------------------------------------------------------------

void __fastcall TFormCompDetail::FormClose(TObject *Sender,
      TCloseAction &Action)
{
        if(DataModule2->ADOConnection1->InTransaction==true)
        {
                DataModule2->ADOConnection1->RollbackTrans();
           
                if(DataModule2->ADOConnection1->InTransaction==true)
                        ShowMessage("rollback transaction error");
        }
}
//---------------------------------------------------------------------------

void __fastcall TFormCompDetail::btn_confirmClick(TObject *Sender)
{
        if(DataModule2->ADOConnection1->InTransaction==true)
        {
                DataModule2->ADOConnection1->CommitTrans();
                if(DataModule2->ADOConnection1->InTransaction==true)
                        ShowMessage("commit transaction error");
        }
}
//---------------------------------------------------------------------------

void __fastcall TFormCompDetail::btn_cancelClick(TObject *Sender)
{
        if(DataModule2->ADOConnection1->InTransaction==true)
        {
                DataModule2->ADOConnection1->RollbackTrans();

                if(DataModule2->ADOConnection1->InTransaction==true)
                        ShowMessage("rollback transaction error");
        }
        FormCompDetail->Close();
}
//---------------------------------------------------------------------------


З.Ы, доп вопрос - в хелпе написано, что РоллбАк при корректном резалте вызывает соответствующее событие и ставит InTransaction в TRUE, но у меня он после вызова ставит флаг в FALSE, соответствующее событие при этом генерируется, а значит сам роллбак сработал правильно - нестыковка..
11
28 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
если напрямую правишь таблицы через Edit/Post то может и не сработать транзакция... делай SQL в рамках транзакциии, так серверу понятней будет
1
28 апреля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
если напрямую правишь таблицы через Edit/Post то может и не сработать транзакция... делай SQL в рамках транзакциии, так серверу понятней будет


Христос Воскрес!
Кроме того - сервер должен поддерживать механизм транзакций. А из поста автора не понятно с какой базой он работает.

15K
30 апреля 2008 года
nevi
35 / / 13.05.2007
субд mssql, таблицы правятся через компоненты Data Controls
Цитата:
делай SQL в рамках транзакциии, так серверу понятней будет


что вы хотите сказать? внутри транзакции править таблицу только sql-запросами?

11
30 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: nevi
субд mssql, таблицы правятся через компоненты Data Controls

что вы хотите сказать? внутри транзакции править таблицу только sql-запросами?



именно только через SQL, и лучше формировать транзакцию непосредственно в самом запросе

 
Код:
BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1
15K
30 апреля 2008 года
nevi
35 / / 13.05.2007
спасибо.
пока вы не ушли - можно еще вопрос?
если фильтр в АДОтайбле или адокьювери не дает результатов, то ДБГрид, зацепленный на эту таблицу всеравно выводит первую строчку из таблицы, при этом свойство RecordCount у таблиц как и полагается равно нулю. Никакие рефреши не действуют, открытие/закрытие тоже не помогает (

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог