Есть много и много вопросов о том, как использовать транзакции. Я хочу знать, что КОГДА? При каких обстоятельствах? Какие типы запросов? Могут ли Try-Catch блоки быть достаточно? Etc...
Я разработал базу данных с ~ 20 таблицами и ~ 20 хранимыми процедурами. В настоящее время ни один из моих SP не использует транзакцию, но есть множество блоков Try-Catch. Причина в том, что каждый раз, когда я пытался обернуть их в транзакцию, SP перестанет функционировать, и я получаю недостающие данные и хуже, чем если бы я использовал Trans.
Итак, снова...
- Когда подходящее время для использования транзакции?
- В качестве последующего вопроса, если я их использую, как я могу использовать их таким образом, чтобы ТОЛЬКО предотвращать одновременное обращение к другим данным SP, чтобы предотвратить коррупцию, а не приводить к тому, что мои SP не работает вообще?
Вот небольшой пример SP, который я написал для переименования продукта:
CREATE PROCEDURE spRenameProduct
@pKey int = NULL,
@pName varchar(50)
AS
BEGIN
BEGIN TRY
IF LTRIM(RTRIM(@pName)) = '' SET @pName = NULL
IF NOT @pKey IS NULL AND NOT @pName IS NULL BEGIN
declare @pKeyExisting int = (select MIN(ID) from rProduct where Product like @pName and not ID = @pKey)
IF @pKeyExisting is null BEGIN
update rProduct set IsValid = 1, Product = @pName where ID = @pKey
END ELSE BEGIN
update Request set ProductID = @pKeyExisting where ProductID = @pKey
update StatusReport set ProductID = @pKeyExisting where ProductID = @pKey
delete from rProduct where ID = @pKey
END
END
END TRY BEGIN CATCH END CATCH
END
Теперь, что, если два человека использовали это в одно и то же время? Я действительно не хочу, и у меня нет времени (к сожалению), чтобы понять. ПОЦЕЛУЙ. является лучшим в этом случае.:)