Получение новой версии строки после 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 может, например, вернуть неправильное значение, если триггер выполняется в таблице со столбцом идентификаторов.

Другие вопросы по тегам