Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

Транзакции осуществляются в соединении или как? 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.053 c
15-1224154232
Darvin
2008-10-16 14:50
2008.12.21
COM и иерархия ООП


15-1224514064
GrayFace
2008-10-20 18:47
2008.12.21
Как проследить, какие программы гоняют пакеты?


2-1226592987
aKor
2008-11-13 19:16
2008.12.21
DBGrid


2-1226407448
Новичок00
2008-11-11 15:44
2008.12.21
Документация по Jedi VCL


15-1224490553
Михаил2
2008-10-20 12:15
2008.12.21
Unicode, зачем так сделано





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский