Позволит ли периодическая фиксация внутри 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 для запуска меньшими партиями.