Можно ли снять блокировки журнала транзакций из активной хранимой процедуры (массивное перемещение данных)? - PullRequest
0 голосов
/ 14 января 2019

отредактированная терминология для точности:

У нас есть большие ежедневные потоки данных в нашей витрине. Некоторые из крупнейших операций, выполняемых с помощью хранимых процедур, управляемых службами SSIS, занимают несколько часов. Эти долговременные хранимые процедуры не позволяют очистить журнал транзакций (что усугубляет проблему, потому что у нас одновременно работают многочисленные SP, которые затем записывают в T-журнал без усечения). В конце концов это нарушает нашу базу данных, и мы вынуждены восстанавливаться после утреннего снимка.

Мы исследовали выполнение «суб» коммитов в SP, но, насколько я понимаю, вы не можете полностью освободить журнал транзакций в активной хранимой процедуре, поскольку она сама является транзакцией.

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

редактирование / расширение:

Возможно, я ошибся выше: Позволит ли периодическая фиксация внутри SP разрешить усечение журнала транзакций?

1 Ответ

0 голосов
/ 14 января 2019

Позволит ли периодическая фиксация внутри SP SP обрезать журнал транзакций?

Если клиент запускает транзакцию, не рекомендуется ЗАПИСАТЬ эту транзакцию внутри хранимой процедуры. не допускается для выхода из хранимой процедуры с другим @@ trancount, чем было введено.

Технически разрешен следующий шаблон *1011*, хотя я никогда не видел его в реальном мире:

use tempdb
if @@trancount > 0 rollback
go
drop table if exists T
create table T(id int identity)
go
create or alter procedure tranTest
as
begin

  insert into T default values

  commit transaction

  begin transaction

end
go

begin transaction 
exec tranTest
select * from T
rollback

go 5

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

Если клиент не запускает транзакцию, вы можете иметь несколько транзакций внутри хранимой процедуры, но наименьшая степень детализации для транзакции - это один оператор DML. Поэтому каждый INSERT, UPDATE, DELETE или MERGE будет выполняться в одной транзакции.

Практические решения для этого, в порядке убывания благости:

1) Увеличение хранилища, доступного для файла журнала, для размещения транзакций.

2) Рефакторинг ETL для использования более коротких транзакций, возможно, для чтения данных в таблицах с указанием таблиц и загрузки или переключения в одну, окончательную транзакцию

3) Рефакторинг ETL для запуска меньшими партиями.

...