Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Транзакции осуществляются в соединении или как? ADO   Найти похожие ветки 

 
Vlad Oshin ©   (2008-05-27 14:48) [0]

не может ли так получится, что разные потоки/соединения/ будут друг другу мешать?
Т.е. если установить у
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


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

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


 
Stas ©   (2008-05-27 15:02) [1]

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


 
Stas ©   (2008-05-27 15:07) [2]

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


 
Vlad Oshin ©   (2008-05-27 15:07) [3]

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

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

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


 
Vlad Oshin ©   (2008-05-27 15:08) [4]

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

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

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


 
Vlad Oshin ©   (2008-05-27 15:08) [5]

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

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

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


 
Vlad Oshin ©   (2008-05-27 15:14) [6]


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

это понятно,


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

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

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


 
Stas ©   (2008-05-27 15:14) [7]

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


 
Stas ©   (2008-05-27 15:20) [8]

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


 
MsGuns ©   (2008-05-27 15:54) [9]

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

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

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

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


 
MsGuns ©   (2008-05-27 15:54) [10]

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


 
DiamondShark ©   (2008-05-28 14:21) [11]


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1224236239
DevilDevil
2008-10-17 13:37
2008.12.21
Чем D6 лучше, чем D5, а D7 - лучше D6 ?


2-1226277502
ЛамерЪХ
2008-11-10 03:38
2008.12.21
Поиск всех главных окон


2-1226403905
IVAKA_27
2008-11-11 14:45
2008.12.21
нужен совет по TreeNode


2-1226161946
Надуев Алексей
2008-11-08 19:32
2008.12.21
WebBrowser


2-1226321890
MegaVolt_old
2008-11-10 15:58
2008.12.21
Подскажите про работу с PWideChar.