![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно делать транзакции при удалении/создании таблиц? [D7, MSSQL]
Zelius © (2003-02-27 14:57:00)Хочу сделать что-то типа этого:
StartTransaction;
try
DropTable;
CreateTable;
OpenTable;
FillTable;
Commit;
except
Rollback;
raise;
end;
Но она не дает открыть таблицу после ее создания! Если транзакцию убрать, то все работает!
Zelius (2003-02-27 19:01:00) [1]Johnmen - спасибо! ответ меня устраивает!
ermserg (2003-02-27 18:15:00) [2]Mne ne legche :)
Eto ne seryozno.
begin transaction;
create table tbl(clmn int);
commit transaction; - posle etogo tablitsa suschestvuyet, potomu-chto CREATE v realnosti bilo, NO
begin transaction;
create table tbl(clmn int);
rollback transaction; - posle etogo tablitsi net, potomu-chto CREATE v realnosti ne bilo.
Ya eto pravilno ulovil?
Johnmen (2003-02-27 17:57:00) [3]Я устал...Мне тяжело...:)
>Tablitsi ne budet.
Вот я и пытаюсь (но видимо безуспешно) намекнуть, что ее не будет не потому, что выполнен настоящий rollback, а потому, что никакого create в реальности вообще не было !
ermserg (2003-02-27 17:29:00) [4]>О реальных или об их эмулировании ?
Ya znayu yavno-startuyemiye i neyavno-startuyemiye. Chto takoye emulirovanniye?
> И что будет, если в ее рамках делаем CREATE TABLE...а потом ROLLBACK
Tablitsi ne budet.
Johnmen (2003-02-27 17:06:00) [5]>ermserg © (27.02.03 16:50)
Еще раз. О каких транзакциях мы говорим ? О реальных или об их эмулировании ?
Если не сложно, попробуй все-таки отмониторить запросы...
>Desdechado © (27.02.03 16:55)
Ну допустим стартовали транзакцию. И что будет, если в ее рамках делаем CREATE TABLE...а потом ROLLBACK ?
Desdechado (2003-02-27 16:55:00) [6]>DDL команды (типа DROP, CREATE) выполняются вне контекста
>пользовательских транзакций.
не совсем так. DDL-команды нужно выполнять в отдельных транзакциях. Просто иначе при попытке обращения к таблице она еще не известна серверу и, след., будет ошибка.
ermserg (2003-02-27 16:50:00) [7]Kak eto pri-chom? Trabsaktsiya mozhet soderzhat i DDL komandi i DML. I vse izmeneniya sdellanniye v transaktsii - i INSERT INTO i CREATE TABLE budut ili commit ili rollback.
Johnmen (2003-02-27 16:29:00) [8]И что ? Ну глянул... И причем здесь это ?
Может просто запустить какой-нибудь SQL Monitor да и отследить приходящие к базе запросы ? Я бы попробовал, да только нет MSSQL и ADO не пользуюсь, да и не нужно это мне, по большому счету...:)))
ermserg (2003-02-27 16:04:00) [9]Ti ne prav. Tolko-chto nashol:
ADOConnection.Properties["Transaction DDL"] := ...
vozmozhniye znachinya sm - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adosql/adoprg04_83jt.asp
Nuzhno bit uverennim, chto ispolzuyemiy provider podderzhivayet dannoye svoystvo.
Johnmen (2003-02-27 15:44:00) [10]...но могу с большой степень достоверности предположть, что все запросы между BeginTrans и RollbackTrans просто ложатся в кеш и реальноне выполняютя...
Johnmen (2003-02-27 15:39:00) [11]Ну я не знаю, что скрывается за методом BeginTrans для ADOConnection и за остальными, стоят ли за ними реальные транзакции...
ermserg (2003-02-27 15:34:00) [12]to Johnmen:
ne uveren. Vot takoye rabotayet na MSSQL2000 s OLE DB Provider:
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOConnection1.BeginTrans;
ADOQuery1.SQL.add("create table t3(t3 int);");
ADOQuery1.ExecSQL;
ADOConnection1.RollbackTrans;
v itoge tablitsi t3 ne suschestviyet. Vozvozhno zavisit on DBE i providera?
Johnmen (2003-02-27 15:09:00) [13]DDL команды (типа DROP, CREATE) выполняются вне контекста пользовательских транзакций.
Значит, здесь они не имеют никакого смысла...