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

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

Транзакции осуществляются в соединении или как? ADO [MSSQL]


Vlad Oshin ©   (2008-05-27 14:48:00) 

не может ли так получится, что разные потоки/соединения/ будут друг другу мешать?
Т.е. если установить у
ADOConnection1: TADOConnection
cв-во     KeepConnection = False

не получится ли так, что например такой код

try  //finally
er:=1;
if cbError.Checked
  then begin
    q2.SQL.Text:='begin transaction;';
    q2.ExecSQL;
  end;
//----------

     q2.SQL.Text:='insert into Table_1 (q) values(30);';
     q2.ExecSQL;

     q2.SQL.Text:='insert into NonExistNameObject values(30);';
     q2.ExecSQL;

//----------
er:=0;
finally //finally
if cbError.Checked
 then begin
   if er=0 then q2.SQL.Text:='commit transaction;'
           else q2.SQL.Text:='rollback transaction;';
   q2.ExecSQL;
 end;
end;    //finally


как нибудь потеряет кто начал транзакцию, а кому ее надо закончить?

не знаю, понятно ли объяснил..


DiamondShark   (2008-05-28 14:21:00) [1]


> хорошо, как сервер узнает, что я

Никак не узнает.
Поэтому первая транзакция будет откатана, а последний commit/rollback завершится с ошибкой "Нет открытой транзакции"


MsGuns   (2008-05-27 15:54:00) [2]

TADOCommand.BeginTrans - CommitTrans/RollBackTrans - явно управляет транзакцией на стороне клиента, т.е все, что было между (в цикле или просто последовательный запуск нескольких модифицирующих запросов) либо подтведится либо откатится.

KeepConnect - см. Help - вполне нормально описан

Для управления транзакциями на стороне сервера предпочтительнее использовать хранимки, запускаемые с клиента "за один раз". При критичной ситуации блокировки также перед запуском и после стартовать и коммитить транзакцию

В мсскл действует вложенный механизм транзакций (т.е. верхняя подтверждает-отменяет нижнюю), что несколько затрудняет понимание после, например, ИБ.
Другими словами, если внутри ХП, запускаемой с клиента, есть старт и подтверждение транзакции, но клиент сам стартует и подтвердает, то в конце концов клиент последнее слово остается за клиентом ;)


MsGuns   (2008-05-27 15:54:00) [3]

Прошу прощения, все, что написано в [9] относится, конечно, к TADOConnection


Stas   (2008-05-27 15:20:00) [4]

в приделах 1-го подключения возможно эта конструкция и пройдет, но если изменится @@SPID, то навряд ли. А так как KeepConnection = False, то вполне возможно что начатая транзакция небудет завершена...
Но разные не попутаются. т.е. не завершиться какая-то другая.


Vlad Oshin   (2008-05-27 15:14:00) [5]


> Дело в том что если не завершиш по какой-либо причине транзакцию,
>  то доступа к этим данным у остальных небудет, до снятия
> этой блокировки.

это понятно,


> почему все не описать на TSQL?

это тоже понятно, что лучше на TSQL.

Ну а в приведенном примере, может так случится, что потеряется "кто на ком стоял"?


Stas   (2008-05-27 15:14:00) [6]

Vlad Oshin ©   (27.05.08 15:07) [3]
Извеняюсь см.2


Vlad Oshin   (2008-05-27 15:08:00) [7]

хорошо, как сервер узнает, что я

начал транзакцию1
отключился
снова подключился через секунду начал транзакцию2
отключился
снова подключился через секунду закончил транзакцию2
закончил транзакцию1

откуда он знает, где какую транзакцию я собираюсь закончить?


Vlad Oshin   (2008-05-27 15:08:00) [8]

хорошо, как сервер узнает, что я

начал транзакцию1
отключился
снова подключился через секунду начал транзакцию2
отключился
снова подключился через секунду закончил транзакцию2
закончил транзакцию1

откуда он знает, где какую транзакцию я собираюсь закончить?


Stas   (2008-05-27 15:07:00) [9]

А, недосмотрел... несколько раз execSQL. Только несовсем понятно зачем именно такая конструкция, почему все не описать на TSQL?
Дело в том что если не завершиш по какой-либо причине транзакцию, то доступа к этим данным у остальных небудет, до снятия этой блокировки.


Vlad Oshin   (2008-05-27 15:07:00) [10]

хорошо, как сервер узнает, что я

начал транзакцию1
отключился
снова подключился через секунду начал транзакцию2
отключился
снова подключился через секунду закончил транзакцию2
закончил транзакцию1

откуда он знает, где какую транзакцию я собираюсь закончить?


Stas   (2008-05-27 15:02:00) [11]

нет конечно, транзакция ведь роходит на сервере.


Наверх

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