繁体   English   中英

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

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

编辑的术语的准确性:

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

我们已经探讨了在SP中执行“子”提交,但是据我了解,您不能完全释放活动存储过程中的事务日志,因为它本身就是事务。

无需重构我们的大型SP即可批量运行或达到某种效果,是否有可能在活动SP中定期提交事务日志,从而释放对事务日志的锁定?

编辑/扩展名:

上面我可能是错的:在SP中间歇性地提交会否使事务日志截断?

在SP中间歇性提交会否使事务日志截断?

如果客户端启动事务,则不建议在存储过程中提交该事务。 不允许使用与输入时不同的@@ 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以小批量运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM