1

我有 2 个会话,每个会话执行相同的任务但在不同的表上,如下

begin tran
 update...set...
commit tran
checkpoint

每次更新都是一个大批量。数据库处于简单恢复模式。为了避免 t-log 变得太大,我们发出检查点,以便 t-log 截断可能发生。

我的问题是:如果会话 A 提交事务并在会话 B 仍在更新过程中时发出检查点,会话 A 发出的检查点是否会由于会话 B 的活动事务而等待会话 B?换句话说,检查点是否必须等待所有活动事务完成?两个会话形成僵局的可能性有多大?

另外,如果同时发出两个检查点命令会发生什么?

请注意,会话 A 更新 table_A,会话 B 更新 table_B。他们永远不会在任何给定时间更新同一张表。

我也知道使用 insert into、rename、drop 可以实现更快的更新。但我仅限于不这样做。我只想了解检查点并发。

谢谢,

4

2 回答 2

1

手册Checkpoint只是告诉 SQL Server 将内存中的更改写入磁盘。它应该对日志的大小没有影响。

如果 Session A 在 Session B 处于不同表的事务中时提交和检查点,这些是不相关的事件 - Session A 检查点将继续进行,Session B 事务也将继续。由于手动检查点只是在程序员选择的时间而不是在 SQL Server 的选择时间强制将内存中的数据写入磁盘,因此唯一可察觉的后果应该是性能略有下降。

由于检查点在数据库级别生效,因此 concurrent Checkpoints 应该与 one 具有相同的效果Checkpoint

于 2013-10-03T22:38:27.723 回答
0

检查点与数据库中的数据完全没有关系。它们不会导致数据更改或可见性更改。

您可能会大大降低性能。

此外,这不太可能解决您的日志问题,因为默认情况下 SQL Server 无论如何都会定期检查点。进一步了解日志,您一定会找到更好的方法来解决这个问题。或者询问有关您的日志问题的问题。

于 2013-10-03T22:47:20.503 回答