Когда использовать транзакции в SQL Server

Есть много и много вопросов о том, как использовать транзакции. Я хочу знать, что КОГДА? При каких обстоятельствах? Какие типы запросов? Могут ли 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

Теперь, что, если два человека использовали это в одно и то же время? Я действительно не хочу, и у меня нет времени (к сожалению), чтобы понять. ПОЦЕЛУЙ. является лучшим в этом случае.:)

Ответы

Ответ 1

Вы используете транзакции, когда набор выполняемых вами операций с базой данных должен быть atomic.

То есть - все они должны преуспеть в или. Ничего между ними.

Транзакции должны использоваться для обеспечения того, чтобы база данных всегда находилась в согласованном состоянии.

В общем случае, если нет веской причины не использовать их (например, продолжительный процесс), используйте их. Подробнее см. этот пост в блоге.


Блоки

Try/Catch не имеют ничего общего с транзакциями - они используются для обработки исключений. Эти два понятия не связаны друг с другом и не заменяют друг друга.

Ответ 2

Общий ответ: транзакции позволяют операциям базы данных быть атомарными. Это путаница в том, что это значит. Это не касается конкретных операций, связанных с тем, являются ли они SELECT, UPDATE, DELETE и т.д. Это касается семантического значения самих данных. С точки зрения операций, снизу вверх, мы говорим, что в качестве группы они являются атомарными. Но, с абстрактного уровня, глядя сверху вниз, мы говорим, что мы сохраняем информацию.

Простым примером может быть, если у вас было 2 аккаунта, и вы не хотели, чтобы деньги были созданы или уничтожены при передаче между ними. Другой, более утонченный пример, был бы, если бы у вас была группа данных, которые должны были быть созданы или уничтожены как группа. Другими словами, частичная информация не имеет смысла. Я предполагаю, что пример может быть, если у вас есть пользователь и вы хотели бы всегда гарантировать, что у них есть имя и фамилия. Не частичное имя.

С учетом сказанного, люди придумывают фразы и эмпирические правила, чтобы выразить то, что атомные средства, такие как "все операции должны быть успешными или неудачными". Кроме того, люди склонны замечать шаблоны, например, SELECT не нуждается в транзакции.