Read Committed and Large Objects
В моей последней статье было показано, что SQL Server при исполнении оператора UPDATE откладывает фиксацию блокировки до конца чтения (вместо снятия блокировок со строк сразу после их освобождения). Как там отмечалось, это делается для того, чтобы между просмотром или поиском строк для предстоящего изменения не допустить другие изменения. В этой статье будет рассмотрен аналогичный алгоритм при работе с большими объектами.
Давайте понаблюдаем за этим поведением. Начните с создания следующей таблицы:
Обычно, когда SQL Server прогоняет данные через блокирующий оператор, например, это может быть сортировка, он делает промежуточную материализацию этих данных. После того, как SQL Server сделает такую копию, нет необходимости в дальнейшем блокировании исходных строк или источника данных. Однако, поскольку большие объекты (например, varchar (max)) могут занимать до 2 Гбайт, делать копии больших объектов как правило непрактично. Взамен, когда это возможно, SQL Server использует указатели на данные вместо того, чтобы материализовать копию данных. Для гарантии, что указатели остаются актуальными, SQL Server не снимает блокировку строк, содержащих большие объекты, до завершения инструкции.