SQL Server: как работают транзакции - PullRequest
3 голосов
/ 05 октября 2010

В SQL Server, сколько транзакций это произведет?

DECLARE @deleted BIGINT
SET @deleted = 100000
WHILE @deleted = 100000
BEGIN
DELETE TOP(100000) FROM MYTABLE WITH (ROWLOCK)
where Col1 = 7048 and COL2 = 39727 and Col3 = 0
SET @deleted = (SELECT @@ROWCOUNT)
END

Если я откажусь после 10 минут работы, потребуется ли откат?

Исправит ли добавление существующей транзакции и завершение транзакции, если я не хочу, чтобы откат проходил одну итерацию после отмены?

Будет ли какая-то разница, если я положу это в хранимую процедуру?

Ответы [ 3 ]

4 голосов
/ 05 октября 2010

Если у вас нет BEGIN TRANSACTION и COMMIT, вы подразумеваете транзакции. И каждая DELETE будет отдельной транзакцией. Итак, если вы отмените скрипт, он откатит текущую команду. Но все предыдущие DELETE шаги уже совершены.

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

2 голосов
/ 05 октября 2010

Это будет неявная транзакция. помните КИСЛОТУ? все в SQL Server является транзакцией, неявной или явной, иначе вы не сможете гарантировать ACID

0 голосов
/ 05 октября 2010

Я считаю, что это будет выполнено в рамках одной транзакции (которую SQL Server создает для вас в этом случае).Вы можете запустить Profiler, чтобы проверить это.Помещение этого в сохраненный процесс не будет иметь никакого значения.Я мог бы предложить вам установить Начальный Тран (и соответствующий Конечный Тран) для каждого прохода через цикл.Одна вещь, которую это поможет предотвратить, - это слишком большой журнал транзакций.

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