Будет ли SQL Server записывать изменения, если мы не укажем ключевые слова транзакции? - PullRequest
4 голосов
/ 04 сентября 2011

Если мы не указываем Begin Trans, Commit Trans и т. Д. ... и просто используем простую инструкцию SQL, например, такую:

delete from myTable where id = 1 

внутри хранимой процедуры,

  1. Будет ли SQL Server записывать изменения в журнал транзакций?Если да, то как мы можем их использовать, пока не указано ключевое слово Begin Trans (мы не можем использовать RollBack).

  2. Когда мы пишем хранимые процедуры, рекомендуется всегдаиспользовать ключевые слова транзакции или лучше использовать их, когда они кажутся подходящими (например, когда нам нужно откатить изменение)?

edit : спасиборебята.а как насчет второй части моего вопроса 1 ??Как мне восстановить мои данные с помощью журнала транзакций ??

Ответы [ 2 ]

4 голосов
/ 04 сентября 2011

По умолчанию SQL Server работает в режиме auto commit, то есть каждый оператор автоматически находится в своей собственной транзакции и автоматически фиксируется и записывается в журнал транзакций (или автоматически откатывается в случае ошибки). Как только транзакция зафиксирована, ее нельзя откатить, и вам нужно будет выполнить откат от последней резервной копии, чтобы исправить любые ошибки (при условии наличия последней доступной резервной копии и модели восстановления).

Вы можете изменить это поведение, используя set implicit_transactions on, после чего ничего не фиксируется, пока вы не введете команду commit.

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

0 голосов
/ 04 сентября 2011

SQL Server всегда и работает только с доступным и включенным журналом транзакций, by design нельзя сказать, чтобы SQL Server не использовал его.

это не исключает того, что в некоторых случаях у вас есть определенные команды или опции для команд, которые позволяют указывать SQL Server минимизировать запись журнала, например TRUNCATE отличается от DELETE, поскольку данные удаляются и удаляются не войти в журнал. В других случаях вы можете указать уровень журнала для некоторых групповых команд, чтобы свести к минимуму ведение журнала.

Сказано, что SQL Server выполняет фиксацию немедленно, если вы выполняете команду в Management Studio или из кода и не указываете какую-либо транзакцию (Begin, Commit или rollback).

Я не очень разбираюсь в SQL, но я знаю, что есть концепция AutoCommit, которая также может быть изменена или установлена ​​на уровень, отличный от уровня по умолчанию.

При удалении, указанном выше, изменения будут применены немедленно, и информация будет записана в журнал.

Обычно в хранимых процедурах мы не внедряем BEGIN и COMMIT или ROLLBACK внутри самого тела хранимой процедуры, но мы используем BeginTrans / Commit или Rollback из C # DAL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...