![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакции осуществляются в соединении или как? 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]нет конечно, транзакция ведь роходит на сервере.