Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Access и begin transaction [D6, WinXP]


Palladin ©   (2004-11-22 12:58:00) 

Гарантировано ли это будет обрабатыватся jet как транзакция?

q.sql.text:='begin transaction';
q.ExecSQL;
q.SQL.text:='insert into tbl1 (d) values (null)';
q.ExecSQL;
q.SQL.Text:='select @@Identity';
q.Open;
Edit1.Text:=q.Fields[0].AsString;
q.Close;
q.SQL.Text:='commit';
q.ExecSQL;


что то гложут сомнения, а проверить: нет времени писать стрессовое приложение...


Palladin   (2004-11-23 11:34:00) [1]

Это понятно. Меня больше волновала ситуация когда:

Два соединения, два Query с двумя разными соединениями. Последовательность выполнения:

Первый Query. Insert
Второй Query. Insert
Первый Query. Select @@Identity

загвоздка была в том что вернет @@Identity, значение от "Первый Query. Insert" или "Второй Query. Insert"... утром встав на свежую голову я понял что никакого стрессового приложения писать не надо :) просто провести этот тест... я не знаком с внутренними механизмами работы джета, потому этот вопрос меня и волновал... все разрулилось так как мне и надо... "Первый Query. Select @@Identity" вернул "Первый Query. Insert"...


msguns   (2004-11-23 10:30:00) [2]

>Palladin ©   (22.11.04 18:15) [9]

Сервер не "разбирает" потоков, для него есть просто запросы и транзакции (коннекты), в контексте которых они должны выполняться и завершаться (ролбак/коммит). Генераторы же работают вообще автономно, вне всяких контекстов. Поэтому если пришло n запросов на значение генератора, то он выдаст n разныхзначений, совершенно не разбираясь в каком соединении-транзакции-потоке эти запросы выполнялись.


Palladin   (2004-11-22 18:15:00) [3]


> изза блокировки

Вот оно! :) это я и хотел узнать, сапасибо и респект.


> [7] msguns ©   (22.11.04 14:24)

Приложение многопоточное, есть пул из нескольких соединений и толпа потоков, каждый со своим TADOQuery.


sniknik   (2004-11-22 14:57:00) [4]

> Просто интересно, почему? Движок не поддерживает?
ага, неподдерживает.

> Хм. Возможно ли такая ситуация, что при одновременном исполнении этой последовательности комманд через два разных соединения один
> @@Identity канет в лету, а второй вернется через оба соединения?
нет, скорее второй вызов инсерта во втором конекте вообще не сработает изза блокировки (если до комита/ролбека в первом вызов).
увеличение счетчика в любом случае как раз и гарантирует уникальность в любом случае. ;о) или полную отмену позиции.


msguns   (2004-11-22 14:24:00) [5]

>Palladin ©   (22.11.04 13:34) [5]
>Хм. Возможно ли такая ситуация, что при одновременном исполнении этой последовательности комманд через два разных соединения один @@Identity канет в лету, а второй вернется через оба соединения?

Кгхм.. Это как это ? Типа один заспрос через 2 соединения ?.
А если это будут 2 разныхзапроса, то какая разница
 а) в одном коннекте они запущены или в разных - автоинкремент работает независимо.
 б) как они (запросы) завершатся. "Серверу" ведь это по барабану.


Johnmen   (2004-11-22 13:54:00) [6]


> sniknik ©   (22.11.04 13:28) [3]
> а вот так в Access не пройдет. ;о(


Просто интересно, почему? Движок не поддерживает?


Palladin   (2004-11-22 13:34:00) [7]

[4] было Johnmen'у...


> [2] sniknik ©   (22.11.04 13:27)

Хм. Возможно ли такая ситуация, что при одновременном исполнении этой последовательности комманд через два разных соединения один @@Identity канет в лету, а второй вернется через оба соединения?


Palladin   (2004-11-22 13:30:00) [8]

Да будет вам известно аццесс не поддерживает скрипты.


sniknik   (2004-11-22 13:28:00) [9]

Johnmen ©   (22.11.04 13:25) [1]
а вот так в Access не пройдет. ;о(


sniknik   (2004-11-22 13:27:00) [10]

да, при условии подключения к одному конекту, только значение автоинкрементного счетчика увеличится даже при rollback transaction.
(т.е. при следующем инсерте будет пропуск на невнесенной записи)

и
q.SQL.Text:='commit transaction';


Johnmen   (2004-11-22 13:25:00) [11]

Не знаю, как там с эмулированием тр-ий в джете для Аксеса, но то, что хочешь, делается так:
q.SQL.text:=
'insert into tbl1 (d) values (null);'+
'select @@Identity';
q.Open;
Edit1.Text:=q.Fields[0].AsString;


Наверх

Титульная страница Поиск, карта сайта Написать письмо