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