小编ToC*_*ToC的帖子

在 Sql Server 中,有没有办法检查选定的一组行是否被锁定?

我们正在尝试更新/删除数十亿行表中的大量记录。由于这是一张受欢迎的桌子,因此这张桌子的不同部分有很多活动。任何大型更新/删除活动都被长时间阻塞(因为它正在等待获得所有行的锁或页锁或表锁),从而导致超时或需要多天才能完成任务。

因此,我们正在更改一次删除小批量行的方法。但是我们想检查选定的(比如 100、1000 或 2000 行)当前是否被不同的进程锁定。

  • 如果没有,则继续删除/更新。
  • 如果它们被锁定,则移至下一组记录。
  • 最后,回到开头并尝试更新/删除遗漏的。

这是可行的吗?

谢谢,ToC

sql-server locking blocking

21
推荐指数
3
解决办法
6439
查看次数

这两个 SQL Server 回滚有何不同?

在 SQL Server 2008 R2 中,这两种回滚有何不同:

  1. 运行一条ALTER语句几分钟,然后点击“取消执行”。完全回滚需要几分钟时间。

  2. 运行相同的ALTER语句,但这要确保LDF文件不够大,无法成功完成。一旦达到LDF限制并且不允许“自动增长”,查询执行将立即停止(或发生回滚)并显示以下错误消息:

The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full. 
To find out why space in the log cannot be reused, see the 
log_reuse_wait_desc column in sys.databases
Run Code Online (Sandbox Code Playgroud)

这两者在以下几点上有何不同?

  1. 为什么第二次“回滚”是瞬时的?我不完全确定它是否可以称为回滚。我的猜测是,事务日志是随着执行的进行而写入的,一旦它意识到没有足够的空间来完全完成任务,它就会停止并显示一些“结束”消息,而不提交。

  2. 当第一次回滚花费这么多时间(回滚单线程)时会发生什么?
    2.1. SQL Server 会返回并撤消LDF文件中的条目吗?
    2.2. 该LDF文件大小在回滚结束变得更小(从DBCC SQLPERF(LOGSPACE)

  3. 另一个问题:在第二种情况下,SQL Server 开始使用LDF文件的速度非常快。就我而言,它在前几分钟(< 4 分钟)内从 18% 的使用率增加到 90% …

sql-server sql-server-2008-r2 database-internals rollback transaction-log

13
推荐指数
1
解决办法
543
查看次数

Sql Server:如何从发布者查询订阅和文章列表(对于给定的发布)

在 Sql Server 2014 中,如何查询发布者给定发布的订阅及其文章列表?(事务复制)

是的,有更简单的方法可以从发行商处查询,但我需要从发行商端进行查询。

远程分销商模型(如果有帮助)

谢谢,

replication sql-server transactional-replication sql-server-2014

5
推荐指数
2
解决办法
3万
查看次数