Sql server SQL Server:SQL请求在写入t-log或更新b-tree后返回

Sql server SQL Server:SQL请求在写入t-log或更新b-tree后返回,sql-server,transaction-log,Sql Server,Transaction Log,对于变异SQL语句(insert、update、delete),SQL何时向客户机返回响应 这是吗 将更改写入事务日志但未更新b-tree后,或 将更改写入事务日志并更新b树索引后 我很困惑,因为为了使seek操作正常工作,b-树索引必须是最新的,所以我认为#2是正确的 但事务日志也用于从崩溃中恢复。如果在突变请求中间出现SQL崩溃,客户端无论如何都不会接收成功代码,客户端可以重试。 那么,假设不涉及复制,t-log在什么情况下提供灾难恢复?了解SQL Server对存储数据进行更改的逐步过程非

对于变异SQL语句(insert、update、delete),SQL何时向客户机返回响应

这是吗

  • 将更改写入事务日志但未更新b-tree后,或
  • 将更改写入事务日志并更新b树索引后
  • 我很困惑,因为为了使seek操作正常工作,b-树索引必须是最新的,所以我认为#2是正确的

    但事务日志也用于从崩溃中恢复。如果在突变请求中间出现SQL崩溃,客户端无论如何都不会接收成功代码,客户端可以重试。
    那么,假设不涉及复制,t-log在什么情况下提供灾难恢复?

    了解SQL Server对存储数据进行更改的逐步过程非常重要

    SQL Server使用
    Write-Ahead Logging
    算法对SQL Server中存储的数据进行任何更改。以下是确保每个语句/事务维护SQL Server的ACID属性所采取的步骤

  • 需要更新的页[行]的副本加载到缓冲区缓存中。即B-树的所有相关页和任何非聚集索引(如果有)
  • 对缓冲区缓存中的页面副本进行更改
  • 此时,页面被标记为脏页
  • 事务日志中会为缓冲区缓存中页面的每次更改创建一个条目
  • 将有关成功/不成功更改的响应返回给客户端

  • 最后发出一个检查点(这可能发生在发送用户响应之前或之后,因为这是一个单独的过程),该过程扫描缓冲区缓存中的脏页,将更改写入磁盘,并从缓存中删除脏页记录(该过程也称为
    刷新页面
    )。只有在这一阶段,更改才会真正写入磁盘

  • 检查点进程确保不会刷新脏页。此过程保证SQL Server中事务的ACID属性

    如果页面仅在缓冲区缓存中被修改,而未写入磁盘(脏页),此时如果SQL Server崩溃,在返回联机后,SQL Server将决定是前滚还是回滚事务,但数据始终保持一致状态


    如果上面提到的过程在中间的任何地方都失败,并且不能以任何理由完成整个过程,SQL Server将数据页标记为可疑(数据库损坏),这种情况有时会发生,但不经常发生(此时您将看到您的DBA出汗)。但是您不应该担心这一点,除非您是DBA:)

    不会为每个查询发出检查点。服务器向客户端返回响应,而与检查点没有直接关系。检查点有几种类型:自动(与恢复间隔服务器配置和未完成写入数相关)、间接(与目标恢复时间和服务器版本相关,因为默认值在2016年从0分钟更改为1分钟)、手动(执行查询)和内部(与备份数据库等任务相关)。您可以使用sys.dm_os_buffer查找脏页和干净页_descriptors@RonenAriely从未声明为每个事务都发出了检查点,但当发出检查点时,其余的事务就会发生。您在步骤5中编写了它,但不应该在那里!服务器不会等待下一个检查点以返回结果;-)。您应该删除第5步,该步骤是根据我上面提到的检查点类型在单独的任务中完成的。@Ronenariley是的,现在再次阅读它,看起来我建议对用户的响应只是在发出检查点并刷新页面时出现的问题:),现在将进行排序,谢谢你,巴德。我试着像你一样把你的名字写在@上,但是由于某种原因网站清除了这个名字。。。我不知道如何在评论开头添加“@M.Ali”