Транзакции всегда атомарны? - PullRequest
4 голосов
/ 12 июля 2011

Я пытаюсь лучше понять нюансы транзакций SQL Server.

Скажем, у меня есть запрос, который обновляет 1000 существующих строк, обновляя один из столбцов, чтобы иметь значения от 1 до 1000.Возможно выполнить этот запрос, и по завершении эти строки не будут пронумерованы последовательно.Это связано с тем, что другой запрос может изменить одну из этих строк до того, как мой запрос завершится.

С другой стороны, если я заверну эти обновления в транзакцию, это гарантирует, что в случае сбоя любого обновления я смогупровалить все обновления.Но значит ли это, что эти строки гарантированно будут последовательными, когда я закончу?

Другими словами, транзакции всегда атомарные?

Ответы [ 5 ]

5 голосов
/ 12 июля 2011

Но значит ли это, что эти строки будут гарантированно последовательными, когда я закончу?

Нет.Это не имеет ничего общего с транзакциями, потому что то, что вы запрашиваете, просто не существует: реляционные таблицы не имеют порядка, а запрос «последовательных строк» ​​- неправильный вопрос.Вы можете перефразировать вопрос так: «будет ли 1000 обновленных строк содержать всю последовательность от 1 до 1000 без пробелов»?Скорее всего да, но правда в том, что могут быть пробелы в зависимости от того, как вы делаете обновления.Эти пробелы не будут появляться, потому что обновленные строки изменяются после обновления перед фиксацией, а потому что обновление будет неактивным (не будет обновлять строки), что является распространенной проблемой обновлений типа чтение-изменение-запись назадстрока «пропадает» между чтением и обратной записью из-за одновременных операций)с, а также точную структуру таблицы, включая все индексы.

4 голосов
/ 12 июля 2011

Атомный означает, что операции в транзакции либо происходят, либо не происходят.

Если один из 1000 операторов завершается неудачей, нет операций в рамках транзакции будет зафиксировано.Чем меньше выборка операторов в транзакции - скажем, 100 - означает, что блоки из 100, приводящие к ошибке (скажем, в 501-м), могут быть зафиксированы (первые 400; блок 500 не будет, а 600+ блоки будут).

Но значит ли это, что эти строки будут гарантированно последовательными, когда я закончу?

Вам нужно будет предоставить большеконтекст о том, что вы делаете в транзакции, должен быть «последовательным».

2 голосов
/ 12 июля 2011

2 балла не связаны

Sequential

Если вы вставите значения от 1 до 1000, будет последовательно с WHERE и ORDER BY, чтобы ограничить вас этими 1000 строк в некотором столбце. Если нет дубликатов, вам понадобится уникальное ограничение

Если вы полагаетесь на IDENTITY, это не гарантируется: Всегда ли вставленные записи получают непрерывные значения идентификаторов .

Атомарность

Все транзакции являются атомарными:

2 голосов
/ 12 июля 2011

Транзакции SQL, как и транзакции на всех платформах баз данных, помещают данные в отдельную область, чтобы охватить всю аббревиатуру ACID (атомарную, согласованную, изолированную и надежную). Так что ответ - да.

0 голосов
/ 12 июля 2011

Транзакция гарантирует атомарность. В этом суть.

Ваша проблема в том, что после того, как вы сделаете вставку, они будут «последовательными», пока не появится следующая вещь и не коснется одной из новых записей.

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

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