2015-11-14 3 views
0

В чем необходимость вложенных транзакций в SQL Server? Может ли кто-нибудь объяснить пример в реальном времени.Вложенные транзакции SQL Server

Я понял, что любая ошибка/откат во внутренних транзакциях откатит все транзакции.

+2

[Алфавит SQL Server DBA в день: (26/30) вложенные транзакции реальны] (http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day -2630-вложенные транзакции-в реальных /) –

ответ

3

Вложенные транзакции сами по себе мало что могут использовать в SQL Server (или большинстве других СУБД), я считаю, что только BerkelyDB supports them.

Однако в программировании они, по-моему, имеют применение, но в основном из-за изоляции/разделения кода, наблюдаемой на большинстве языков программирования.

Представьте себе следующую псевдо-код:

function dostuff() 
{ 
    begin transaction 
    //manage data changes 
    commit transaction 
} 

function docomplexstuff() 
{ 
    begin transaction 
    //change some data 
    dostuff() 
    commit transaction 
} 

function whatever 
{ 
    //do random stuff 
    dostuff() 
} 

Если вы называете docomplexstuff вы бы вложенную транзакцию, но это в основном побочный эффект. Внутренняя транзакция фактически гарантирует, что транзакция используется при вызове метода dostuff из любого пути кода, который вы могли бы назвать методом, и внешняя транзакция docomplexstuff гарантирует, что у вас есть манипуляция данными в этом методе, а также в дочернем методе как одна транзакция ,

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

0

Необходимость для меня заключается в выполнении тестов модулей Sql Server/хранимой процедуры.

Вот мой пример ...

Создать процедуру, которая делает что-то для вашего приложения (вставляет записи в нескольких таблиц) - обернуть всю эту вещь в сделке

Написать модульный тест, чтобы проверить, что хранится процедура. Как я пишу свои модульные тесты, они всегда начинаются с begin tran, а затем выполняют хранимую процедуру, которую я пытаюсь проверить, а затем откатываем транзакцию независимо от результата (вы не хотите, чтобы ваши модульные тесты создавали плохие данные в вашем база данных, даже если она находится в среде Dev).

Смежные вопросы