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

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

Транзакция? [D5, MSSQL]


kvit ©   (2004-09-01 12:06:00) 

Есть типа такой хранимой процедуры:

CREATE PROCEDURE [T_add]
(@msg char(10))
AS
--------------------------------------------------------------------------
declare  @ID int, @ID_parent int;
-------------------------------------------------------------------------
set @ID_parent=(select value from CONFIG where param= 'ID_parent')

set  @ID=1+ (select  ISNULL(max(ID), 0)  from T where ID_parent=@ID_parent)

----------------------------------------------------------------------------
insert into T (ID, msg, ID_parent, DT)
values (@ID, @msg, 0, getdate())
---------------------------------------------------------------------------
return(@ID)

Я может не совсем понимаю транзакций, но может ли получиться ситуация, что значение @ID=1+max(ID) будет вставлено другим пользователем при параллельной работе и вызове этой же процедуры?


Ega23   (2004-09-01 14:55:00) [1]

А их 2 ветки было: эта и http://www.delphimaster.ru/cgi-bin/forum.pl?id=1094024081&n=1


KSergey   (2004-09-01 14:54:00) [2]

> [11] Ega23 ©   (01.09.04 14:41)
> Да там вообще какая-то безбашенная идеология о "блуждающих
> между серверами записях".

Меээээ....
Вы о чем???


Ega23   (2004-09-01 14:41:00) [3]

KSergey ©   (01.09.04 14:36) [10]

Да там вообще какая-то безбашенная идеология о "блуждающих между серверами записях". Почему-то оттуда следует, что Identity - никак не можно.


KSergey   (2004-09-01 14:36:00) [4]

А чем Identity не устраивают?


Flagman   (2004-09-01 14:04:00) [5]

> А ещё лучше в ХП вынести, тогда точно не получится.
Согласен.


Ega23   (2004-09-01 14:02:00) [6]

если одним блоком делать, то не получится.
А ещё лучше в ХП вынести, тогда точно не получится.


Flagman   (2004-09-01 13:59:00) [7]

> Ega23

А не получиться, что при одновременной работе процедуры с двух клиентов, после первой транзакция еще не за-commit-ена, и вторая вернет то же значение @X, что и первая?


Ega23   (2004-09-01 13:50:00) [8]

Flagman ©   (01.09.04 13:48) [4]

С какой стати?


Ega23   (2004-09-01 13:49:00) [9]

declare @X int
Select @X=IsNull(Max(ID),0)+1 from Table1
Insert into Table1(ID, ....) values (@x, ....)


Flagman   (2004-09-01 13:48:00) [10]

И set  @ID=1+ (select  ISNULL(max(ID), 0)  from T where ID_parent=@ID_parent) не делать ес-сно...


Flagman   (2004-09-01 13:46:00) [11]

> Роман Снегирев

Я с MSSQL не работал практически. Хм... С генераторами-то удобнее...
Тогда проблема сводится к первоначальной.
Тогда правильнее будет:

insert into T (ID, msg, ID_parent, DT)
values (позволяющая_считывать_последний_вставленный_id(), @msg, 0, getdate())

;)


Роман Снегирев   (2004-09-01 13:30:00) [12]

А что, генераторов в MSSQL нет??? 8-()
конечно же нету, но там есть функция, позволяющая считывать последний вставленный id


Flagman   (2004-09-01 13:17:00) [13]

А что, генераторов в MSSQL нет??? 8-()


Наверх

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