SQLServer 延迟事务持久性
SQL Server 2014新功能 -- 延迟事务持久性(Delayed Transaction Durability)
SQL Server事务提交默认是完全持久性的(Full Durable),从SQL Server 2014开始,增加了新的功能延迟事务持久性,使得事务提交可设置为延时持久性的(Delayed Durable,也叫做(Lazy Commit))。
完全事务持久性(Full Transaction Durability)
在SQL Server 2014之前, SQL Server提交事务是一个同步的过程,也就是说,只有当SQL
Server将该事务相对应的日志记录写入到了磁盘文件之后,才会返回事务提交成功的信号。这也是为了体现事务4个基本特性中的持久性而实现的功能。只有
这样,我们才能保证当SQL
Server因为某些原因突然Crash之后,再重启的时候,那些已经提交但还没有写入到数据文件上的记录可以通过日志文件进行恢复,或者那些还没有提
交,但已经有部分数据写入到数据文件上的记录进行回滚。所以,我们可以看到,对于传统的事务提交,由于必须要保证日志写入到磁盘上,这个I/O操作就有可
能成为性能的瓶颈。
应用场景
完全持久事务在将控制权归还给客户端之前把事务日志强制写入磁盘。 只要存在以下情况,就应使用完全持久事务:
1.系统无法承受任何数据丢失。
2.造成瓶颈的原因不是事务日志写入延迟。
通过在内存中保留事务日志记录并批量写入事务日志,延迟事务持续性可以缩短延迟,因而减少了所需的 I/O 操作。 延迟事务持续性可能会减少日志 I/O 争用,从而减少系统中的等待。
延迟事务持久性(Delayed Transaction Durability)
这个技术可以使得SQL
Server在提交事务时,无需等待事务日志写入磁盘就直接返回事务提交成功的信号,I/O操作在后台会以异步的方式写入到数据库事务日志文件中。这样好
处是,事务可以去除等待I/O操作完成所带来的延时,以此来提高整个SQL Server的性能。在这整个过程中,SQL
Server会在内存中专门开辟出一个特殊的Log Buffer来存放DTD所产生的日志,当这个Log
Buffer一旦存满之后会马上写入日志文件,由此将零散的I/O操作变成了一块一块的操作来提高效率,增加吞吐量。
应用场景
适合使用延迟事务持续性的部分情况如下:
1.可以容忍一定的数据丢失。
如果可以容忍一定的数据丢失,例如只要有大部分数据即可,个别记录不是非常重要,就值得考虑延迟持续性。 如果无法容忍任何数据丢失,则不要使用延迟事务持续性。
2.在事务日志写入时遭遇瓶颈。
如果性能问题是由于事务日志写入延迟造成的,则应用程序可能适合使用延迟事务持续性。
3.工作负载有很高的争用率。
如果系统工作负载争用级别很高,则会花费大量时间等待锁释放。 延迟事务持续性会缩短提交时间,因此能够更快地释放锁,从而实现更大的吞吐量。
控制事务持久性
持久性可以在数据库级别(Database Level)、提交级别(COMMIT Level)或原子块级别(ATOMIC Block Level)进行控制。
数据库级别控制
您作为 DBA,可以控制用户是否可通过以下语句对数据库使用延迟事务持续性。 您必须使用 ALTER DATABASE 来设置延迟持续性设置。ALTER DATABASE … SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
DISABLE:默认设置,不管如何保持完全持久性
ALLOWD:允许延迟持久性执行,要看存储过程,或者TSQL级别的设置
FORCED:强制所有的事务都是延迟持久性的
原子块级别控制 - 本机编译的存储过程
下面的代码面向原子块内部。
DELAYED_DURABILITY = { OFF | ON }
3. 提交级别控制 – T-SQL
COMMIT 语法已扩展,您可以强制实施延迟事务持续性。 如果 DELAYED_DURABILITY 在数据库级别设置为 DISABLED 或 FORCED,则忽略此 COMMIT 选项。
COMMIT [ { TRAN | TRANSACTION } ] [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ] OFF:默认设置,不使用延迟持久事务 ON:启动延迟持久事务
如何强制执行事务日志刷新
有两种方法可以强制将事务日志刷新到磁盘。
1.执行任何可改变相应数据库的完全持久事务。 这会强制将之前提交的所有延迟持续性事务的日志记录刷新到磁盘。
2.执行系统存储过程 sp_flush_log。 此过程会强制将之前提交的所有延迟持久事务的日志记录刷新到磁盘。
其他相关功能与延迟持久性的关系和影响
更改跟踪和变更数据捕获
具有更改跟踪属性的所有事务都是完全持久事务。 如果一个事务的所有写入操作都对表进行,而这些表支持更改跟踪或变更数据捕获 (CDC),则该事务具有更改跟踪属性。
崩溃恢复
一致性可得到保证,但已提交的延迟持久事务的一些更改可能会丢失。
跨数据库和 DTC
如果事务跨数据库或是分布式事务,则无论数据库或事务提交设置如何,它都是完全持久事务。
AlwaysOn 可用性组和镜像
延迟持久事务并不能保证主数据库或任何辅助数据库的持续性。 此外,它们也不保证了解辅助数据库的事务。 提交后,在从同步辅助数据接收到任何确认之前,控制权就会归还客户端。
故障转移群集
某些延迟持久事务写入可能会丢失。
事务复制
延迟持久事务并不保证其复制。 只有在事务成为持久事务后才会得到复制。
日志传送
传送的日志中仅包含已成为持久事务的事务。
日志备份
备份中仅包含已成为持久事务的事务。
如果你对表实施延迟持续性,则应了解某些情况会导致数据丢失。 如果无法容忍任何数据丢失,则不要对表使用延迟持续性。
灾难性事件
发生灾难性事件(如服务器崩溃)时,将丢失已提交但未保存到磁盘的所有事务的数据。 根据数据库中的任何表(持久内存优化或基于磁盘)执行完全持久的事务时,或调用 sp_flush_log
时,延迟的持久事务保存到磁盘。 如果你在使用延迟的持久事务,那么你可能想要在数据库中创建一个小型表,你可定期更新该表或调用 sp_flush_log
,以保存所有未完成的已提交事务。 事务日志还会在变满时刷新,但这难以预测,也无法进行控制。
SQL Server 关闭和重新启动
对
于延迟的持久性,SQL Server 的意外关闭和预期关闭/重新启动没有区别。 与灾难性事件类似,应制定针对数据丢失的计划。
在进行计划的关闭/重新启动时,一些尚未写入磁盘的事务可能会首先保存到磁盘,但不应对其进行计划。
虽然计划了关闭/重启,但无论是否计划,都会像灾难性事件一样丢失数据。
参考:https://msdn.microsoft.com/zh-cn/library/dn449490%28v=sql.120%29.aspx
SQLServer 延迟事务持久性的更多相关文章
- SQL Server 2014新特性——事务持久性控制
控制事务持久性 SQL Server 2014之后事务分为2种:完全持久, 默认或延迟的持久. 完全持久,当事务被提交之后,会把事务日志写入到磁盘,完成后返回给客户端. 延迟持久,事务提交是异步的,在 ...
- (转)对SQLSERVER数据库事务日志的疑问
本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...
- sqlserver关于事务
事务的四个特性: 原子性,一致性,持久性,隔离性 原子性: 原子性:表示事务执行是作为原子,不可分割,整个语句要么执行,要么不执行sqlserver中每一个单独的语句可以看做是包含在事务中每一句本身具 ...
- SQLSERVER备份事务日志的作用
事务日志备份有以下3种类型 (1)纯日志备份:仅包含相隔一段时间的事务日志记录,而不包含任何大容量更改 (2)大容量操作日志备份.包括由大容量操作更改的日志和数据页,不支持时间点恢复 (3)尾日志备份 ...
- SQLSERVER分布式事务使用实例
实例一 尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionnam ...
- SQLServer之事务简介
事务定义 事务是单个的工作单元.事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行. 事务分类 自动提交事务 每条单独的语句都是一个事务. 在自动提 ...
- sQLserver T-SQL 事务的用法
原文在: https://www.lesg.cn/netdaima/2016-55.html 在使用Mssql的时候经常需要用到存储过程 有些操作在前面发生错误的时候:需要回滚:这就需要事务了: 下面 ...
- SqlServer 查看事务锁及执行语句
一.查看当前锁定的事务 ,) ,用户机器名称,) ,是否被锁住),blocked) ,数据库名称,),cmd 命令,waittype as 等待类型 ,last_batch 最后批处理时间,open_ ...
- sqlserver 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...
随机推荐
- 性能调优案例分享:jvm crash的原因 1
性能调优案例分享:jvm crash的原因 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- Android 学习笔记之 个人认为最简单的查看Android源码方案
相信很多人都会疑惑如何使用Eclipse ADT查看源码? 下面我们将介绍 如何查看Android源码. 本文有如下优点: 1.不用费心去找Android源码地址:一个字烦,网上的东西杂七杂八的... ...
- 设计模式(三)—代理模式
目录: 一.概述 二.静态代理 三.动态代理 四.静态代理和动态代理的区别 一.概述 代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对 ...
- 1px 究竟是多大
一.引言 1px 究竟是多大?这应该是一道很不错的面试题.且看: 1.iphone6s 的分辨率是1920px * 1080px 2.iphone6s 全屏截图文件的尺寸是1242px * 2208p ...
- asp.net core源码飘香:Logging组件
简介: 作为基础组件,日志组件被其他组件和中间件所使用,它提供了一个统一的编程模型,即不需要知道日志最终记录到哪里去,只需要调用它即可. 使用方法很简单,通过依赖注入ILogFactory(Creat ...
- Java 判断回文字符串有多少和其中的最大字符串
一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...
- (转)Python 遍历List三种方式
转自: http://www.cnblogs.com/pizitai/archive/2017/02/14/6398276.html # 方法1 print '遍历列表方法1:' for i in l ...
- 在 Intellij 中设置集成 Jenkins 服务器连接
如何在 Intellij 中设置集成 Jenkins 服务器连接 在Intellij中可以很方便的设置Jenkins服务器,不用登录到浏览器中,在Intellij中即可浏览所有job,开发plugin ...
- HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理
1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...
- vscode同步设置&扩展插件
首先安装同步插件: Settings Sync 第二部进入你的github如图: 打开设置选项: 新建一个token: 如图: 记住这个token值 转到vscode 按shift+alt +u ...