ACID 是数据库的基本属性。其中的D是指"持久性":只要事务已经提交,对应的数据修改就会被保存下来,即使出现断电等情况,当系统重启后之前已经提交的数据依然能够反映到数据库中。

那么D特性是如何在SQL Server中实现的呢?SQL Server使用write-ahead logging的方式,保证日志记录会先于数据记录固化到磁盘中。当事务提交后,只有当日志记录固化到磁盘时,才会向客户端返回提交成功的消息,至于相应的数据记录,会通过异步的方式后续写入到磁盘中。如果在此期间发生断电等故障,那么就会出现以下两种情况:

  1. 日志已经写入到磁盘(committed),但数据没有写入:

    系统重启后进行redo操作,通过读取日志,来将没有固化到数据文件的信息写入到数据文件。

  2. 部分日志已经写入到磁盘(uncommitted),数据部分写入或没有写入

    系统重启后执行undo操作,将没有提交的事务对应的数据从数据文件中清除。

这样就保证了已经提交的事务不会丢失。

Delayed durability

SQL Server 2014中引入了一个新的特性,叫做Delayed durability(也称作lazy commit),颠覆了之前提到的概念。通过Delayed durability,可以让日志记录按照一定规律异步地写入到日志文件中,避免日志磁盘写入过于频繁。这样就以牺牲Durability来换取性能。

应用场景:

使用该特性的前提是您的应用可以容忍一定程度的数据丢失。

日志磁盘出现系统瓶颈。

由于日志磁盘性能问题,导致事务无法提交,导致相应的资源(memory,lock等)无法释放引发的资源竞争

Delayed Durability有以下特性:

  1. 一旦事务提交,事务中的数据变更对其他事务(包含full durable transaction和delayed durability transaction)可见。具体请参考isolation level http://msdn.microsoft.com/en-us/library/dn133175.aspx
  2. 事务的持久性(durability)依赖于日志记录是否固化到磁盘。
  3. 内存中的日志记录只有在任意以下情况发生时才会固化到磁盘:
    1. )Full durable transaction进行了数据变更,并且commit.
    2. )执行了sp_flush_log存储过程.
    3. )Log buffer满了,日志记录也会固化到磁盘.

如果1)或2)出现两次,那么SQLSERVER会保证第一次之前的Delayed durability transaction的数据变更已经被固化到了磁盘。

如何使用Delayed durability

Delayed durability是一个数据库级别的特性,默认是禁用的,我们首先要开启这个选项。

ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = FORCED|Allowed|Disabled

如果是forced,那么该数据库内所有的事务都强制使用delayed durability;如果是allowed,那么delayed durability和full durable transaction可以同时存在;如果是disabled,那么无法使用delayed durability.

当该属性发生变化后,errorlog中也会有相应的记录

Setting database option delayed_durability to forced for database 'DDtest'.

Setting database option delayed_durability to allowed for database 'DDtest'.

Setting database option delayed_durability to disabled for database 'DDtest'.

如果数据库的DELAYED_DURABILITY为Allowed,我们可以在语句级别进行控制,否则就要遵循数据库的设定了(如果语句的设定和数据库级别设定冲突,那么SQL Server会使用数据库级别的设定)。

事例

将数据的 DELAYED_DURABILITY设置为Allowed

ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = Allowed

创建一张表,并循环插入1000行数据,每次插入都是一个单独的事务

create table ta(col int)

declare @N int=0

while @n<1000

begin

begin tran

insert ta values(1)

commit tran with(delayed_durability=off)

set @N+=1

print cast(@N as varchar(1000))

end

开启Process Monitor,监控对数据库日志文件的操作。

一共对日志文件进行了1012次的写入操作,也就是每次commit都会立刻固化到日志文件

下面比较一下使用delayed durability的情况

declare @N int=0

while @n<1000

begin

begin tran

insert ta values(1)

commit tran with(delayed_durability=on)

set @N+=1

print cast(@N as varchar(1000))

end

1000个事务只触发了32次写入,大大地减少了对日志文件的写入操作。

注意事项

  1. 当系统不忙时,也会主动将delayed durability的日志记录固化到磁盘。但目前不知道如何判断"不忙"这个标准。
  2. checkpoint不会将delayed durability的日志记录固化到磁盘。
  3. SQL Server正常关闭不会将delayed durability的日志记录固化到磁盘,也就说正常关闭也可能会导致数据丢失,建议之前先执行sp_flush_log。

SQL 2014新特性- Delayed durability的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. SQL Server 2014 新特性——内存数据库(转载)

    目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 内存优化表的索引 并发能力的提升 和竞争对手相比几点 ...

  3. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

  4. 小心SQL SERVER 2014新特性——基数评估引起一些性能问题

    在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...

  5. SQL Server 2014新特性——Buffer Pool扩展

    Buffer Pool扩展 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 缓冲池扩展优点 SQL Server读以随机读为主,S ...

  6. SQL Server 2014 新特性:IO资源调控

    谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...

  7. SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer

    SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企 ...

  8. [SQL Server 2014] SQL Server 2014新特性探秘

    SQL Server 2014新特性探秘(1)-内存数据库   简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...

  9. SQL Server 2014新特性探秘(3)-可更新列存储聚集索引

    简介      列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会 ...

随机推荐

  1. 【读书笔记】iOS网络-错误处理的经验法则

    一,在接口契约中处理错误. 二,错误状态可能不正确. 设备模糊地确认操作是崇拜失败的.比如,移动应用发出HTTP请求以在两个账户间转账.请求被银行系统接收并正确地处理:然而,由于网络失败应答却丢失了, ...

  2. EMC Documentum DQL整理(一)

    1.Get user SELECT * FROM dm_user WHERE r_is_group = 0   2.Get Group SELECT * FROM dm_group WHERE gro ...

  3. yii2使用多个数据库的案例

    作者:白狼 出处:http://www.manks.top/article/yii2_%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8_config 本文版权归作者,欢迎转载, ...

  4. Git从零教你入门(4):Git服务之 gogs部署安装

    Git从零入门系列4: 先看上一篇文章: http://www.51testing.com/index.php?uid-497177-action-viewspace-itemid-3706817 今 ...

  5. HTML的基本代码第一课

    打开DREAMWEAVER,新建HTML,如下图: 其中body的属性: bgcolor---页面背景颜色 text--文字颜色 topmargin--上页边距 leftmargin--左叶边距 ri ...

  6. Servlet/JSP-03 HttpServlet

    一. GenericServlet GenericServlet本身是一个抽象类,并且实现了Servlet和ServletConfig接口 其在内部定义了一个私有的ServletConfig类型的变量 ...

  7. Linux系统监控命令之iotop

    iotop命令 iotop命令是一个用来监视磁盘I/O使用状况的top类工具.iotop具有与top相似的UI,其中包括PID.用户.I/O.进程等相关信息.Linux下的IO统计工具如iostat, ...

  8. 新手必学的java报表开发工具FineReport实用技巧

    1.在制作模板时,如何将报表中的值传递到超链接网页呢? 在项目中以frame方法把F1.CPT放到项目的页面中,对F1.CPT做网络报表超链接F2.CPT,然后在F2.cpt页面中,做个超链接的网页, ...

  9. 玩转Windows Azure存储服务——高级存储

    在上一篇我们把Windows Azure的存储服务用作网盘,本篇我们继续挖掘Windows Azure的存储服务——高级存储.高级存储自然要比普通存储高大上的,因为高级存储是SSD存储!其吞吐量和IO ...

  10. 基于内容产品的MVP探索

    王凯:凯叔讲故事的创始人 1.精益创业有以下3个过程: ——假设:价值假设和增长假设 ——认知:验证认知 ——行动:MVP(最小化可行产品) 2.互联网时代内容该如何定价: ——对于一家初创公司,最重 ...