是否可以从活动(大量数据移动)存储过程中释放事务日志锁?

Is it possible to release Transaction-log locks from within an active (massive data movement) stored procedure?

为了准确性而编辑的术语:

我们的数据集市中每天都有大量数据流。一些最大的,使用 SSIS 管理的存储过程完成,需要几个小时。这些 long-运行ning 存储过程阻止了事务日志的清除(这使问题更加复杂,因为我们同时有许多 SP 的 运行ning,然后它们都写入 T-log 而没有t运行类别)。最终这破坏了我们的数据库,我们被迫从早上的快照中恢复。

我们已经探索过在 SP 中执行 "sub"-提交,但据我了解,您不能在活动存储过程中完全释放事务日志,因为它本身就是一个事务。

在不将我们的大型 SP 批量重构为 运行 或类似效果的情况下,是否可以在活动 SP 中定期提交事务日志,以便我们释放对事务日志的锁定?

编辑/扩展:

也许我上面说错了: 在 SP 内间歇性提交是否允许事务日志 t运行cate?

Will committing intermittently within the SP allow the transaction-log to truncate?

如果客户端启动事务,不建议在存储过程中提交该事务。 不允许使用与输入时不同的@@trancount 退出存储过程。

以下模式技术上是允许的,尽管我从未见过它在现实世界中使用:

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 重构为 运行。