Когда использовать транзакции в SQL Server - PullRequest
19 голосов
/ 16 февраля 2012

Существует множество вопросов о том, КАК использовать транзакции. Что я хочу знать, это КОГДА ? При каких обстоятельствах? Какие типы запросов? Могут ли блоки Try-Catch вместо этого быть достаточными? Etc ...

Я разработал базу данных с ~ 20 таблицами и ~ 20 хранимыми процедурами. В настоящее время ни один из моих SP не использует транзакцию, но есть множество блоков Try-Catch. Причина в том, что каждый раз, когда я пытался обернуть их в транзакции, SP перестала функционировать, и в результате я получал пропущенные данные и хуже, чем если бы я использовал Trans.

Итак, еще раз ...

  1. Когда подходящее время для использования транзакции?
  2. В качестве дополнительного вопроса, если я их использую, как я могу использовать их таким образом, чтобы ТОЛЬКО запретить другим СП одновременно получать доступ к одним и тем же данным, чтобы предотвратить повреждение, а не заставлять моих ИП не работает вообще?

Вот небольшой пример 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

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

Ответы [ 3 ]

35 голосов
/ 16 февраля 2012

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

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

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

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


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

1 голос
/ 02 ноября 2016

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

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

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

0 голосов
/ 02 августа 2018

Перед завершением этого раздела о командах языка управления данными есть еще две команды, которые очень полезны.

Изменения, вносимые в базу данных командами INSERT, UPDATE и DELETE, являются временными до явного подтверждения. Это выполняется командой:

COMMIT;

При выполнении этой команды все сделанные вами изменения в базе данных становятся постоянными и не могут быть отменены.

COMMIT автоматически выполняется при обычном выходе из SQL * Plus. Тем не менее время от времени вводить команду COMMIT не вредно.

COMMIT не применяется ни к каким командам SELECT, так как нет ничего для фиксации.

COMMIT не применяется ни к каким командам DDL (например, CREATE TABLE, CREATE INDEX и т. Д.). Они автоматически фиксируются и не могут быть отменены.

Если вы хотите откатить (т.е. отменить) любые изменения, внесенные в базу данных с момента последней фиксации, вы можете выполнить команду:

ROLLBACK;

Группа связанных SQL-команд, которые все должны успешно завершить или выполнить откат, называется транзакцией. Часть вашего исследования для Outcome 3 включает изучение обработки транзакций и последствий откатов и фиксации.

Кроме того, в процессе вставки, обновления и удаления СУБД необходимо сохранять целостность базы данных и разрешать многопользовательский доступ (т. Е. Параллелизм). Транзакция, которая еще не была зафиксирована, должна быть прозрачной для пользователей. Например, незафиксированная вставка не должна быть доступна другому пользователю. Кроме того, два пользователя, пытающиеся обновить одну и ту же запись, не должны мешать друг другу. Это должно быть управляемым. Параллелизм управляется СУБД с использованием стратегий блокировки. Часть вашего исследования для Outcome 3 включает изучение стратегий блокировки, охватывающих блокировки столбцов, полей строк и таблиц.

...