Форум: "Базы";
Текущий архив: 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.057 c