[英]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.