Получение новой версии строки после INSERT с использованием @@DBTS - это безопасно?
Это обычная практика, чтобы забрать только что созданный IDENTITY
таблицы с использованием @@IDENTITY
переменная после INSERT
,
Правильно ли равенство для получения последнего rowversion
значение после UPDATE
аналогичным образом, используя @@DBTS
значение?
Например:
IF(OBJECT_ID('XXX') IS NOT NULL)
DROP TABLE XXX
GO
CREATE TABLE XXX
(
ID int IDENTITY(1,1) PRIMARY KEY,
Name varchar(64) NOT NULL,
RV rowversion
)
GO
INSERT INTO XXX(Name) VALUES
('Apples'),('Bananas'),('Cranberries'),('Dragon Fruit'),('Eggplant'),('Fig'),('Grape')
GO
SELECT * FROM XXX
GO
UPDATE XXX
SET Name = 'Chocolate' WHERE ID = 3
PRINT @@DBTS
GO
Сейчас @@DBTS
безопасно от одновременных обновлений?
Если другое соединение выполняет вставку и обновления между UPDATE
и PRINT
мы бы в конечном итоге с rowversion
из "другого" соединения, а не из нашего собственного обновления?
1 ответ
По данным MSDN @@DBTS
возвращает значение последней использованной метки времени текущей базы данных
Это означает, что это не потокобезопасно.
Вы также не должны использовать @@IDENTITY
, @@IDENTITY
а также SCOPE_IDENTITY
вернуть последнее значение идентичности, сгенерированное в любой таблице в текущем сеансе. Тем не мение, SCOPE_IDENTITY
возвращает значение только в пределах текущей области видимости; @@IDENTITY
не ограничивается конкретной областью применения. @@IDENTITY
может, например, вернуть неправильное значение, если триггер выполняется в таблице со столбцом идентификаторов.