本篇文章主要介绍SqlServer使用时的注意事项。

想成为一个高级程序员,数据库的使用是必须要会的。而数据库的使用纯熟程度,也侧面反映了一个开发的水平。

下面介绍SqlServer在使用和设计的过程中需要注意的事项。

SqlServer注意事项

Sql事务启动语句

开始事务:BEGIN TRANSACTION

提交事务:COMMIT TRANSACTION

回滚事务:ROLLBACK TRANSACTION

相关注意事项

保持事务简短,事务越短,越不可能造成阻塞。

在事务中尽量避免使用循环while和游标,以及避免采用访问大量行的语句。

事务中不要要求用户输入。

在启动事务前完成所有的计算和查询等操作。

避免同一事务中交错读取和更新。可以使用表变量预先存储数据。即存储过程中查询与更新使用两个事务实现。

超时会让事务不执行回滚,超时后如果客户端关闭连接sqlserver自动回滚事务。如果不关闭,将造成数据丢失,而其他事务将在这个未关闭的连接上执行,造成资源锁定,甚至服务器停止响应。

避免超时后还可打开事务 SET XACT_ABORT ON统计信息可以优化查询速度,统计信息准确可以避免查询扫描,直接进行索引查找。

sp_updatestats可以更新统计信息到最新。

低内存会导致未被客户端连接的查询计划被清除。

修改表结构,修改索引后,查询计划会被清除,可以再修改后运行几遍查询。

DDL DML交错和查询内部SET选项将重新编译查询计划。

order by 影响查询速度。

where中使用函数则会调用筛选器进行扫描,扫描表要尽量避免。

updlock和holdlock同时使用可以在早期锁定后面需要更新的资源,维护资源完整性,避免冲突。

如果不需要使用临时表的统计信息来进行大数据查询,表变量是更好的选择。

事务使用注意事项

设置事务隔离级别(未提交读,读脏),相当于(NOLOCK) 的语句:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

隔离级别描述如下:

1.READ UNCOMMITTED

READ UNCOMMITTED:未提交读,读脏数据。

默认的读操作:需要请求共享锁,允许其他事物读锁定的数据但不允许修改。

READ UNCOMMITTED:读操作不申请锁,运行读取未提交的修改,也就是允许读脏数据,读操作不会影响写操作请求排他锁。

2.READ COMMITTED

READ COMMITTED(已提交读)是SQL SERVER默认的隔离级别,可以避免读取未提交的数据,隔离级别比READ UNCOMMITTED未提交读的级别更高;

该隔离级别读操作之前首先申请并获得共享锁,允许其他读操作读取该锁定的数据,但是写操作必须等待锁释放,一般读操作读取完就会立刻释放共享锁。

3.REPEATABLE READ

REPEATABLE READ(可重复读):保证在一个事务中的两个读操作之间,其他的事务不能修改当前事务读取的数据,该级别事务获取数据前必须先获得共享锁同时获得的共享锁不立即释放一直保持共享锁至事务完成,所以此隔离级别查询完并提交事务很重要。

4.SERIALIZABLE

SERIALIZABLE(可序列化),对于前面的REPEATABLE READ能保证事务可重复读,但是事务只锁定查询第一次运行时获取的数据资源(数据行),而不能锁定查询结果之外的行,就是原本不存在于数据表中的数据。因此在一个事务中当第一个查询和第二个查询过程之间,有其他事务执行插入操作且插入数据满足第一次查询读取过滤的条件时,那么在第二次查询的结果中就会存在这些新插入的数据,使两次查询结果不一致,这种读操作称之为幻读。
为了避免幻读需要将隔离级别设置为SERIALIZABLE

5.SNAPSHOT

SNAPSHOT快照:SNAPSHOT和READ COMMITTED SNAPSHOT两种隔离(可以把事务已经提交的行的上一版本保存在TEMPDB数据库中)
SNAPSHOT隔离级别在逻辑上与SERIALIZABLE类似
READ COMMITTED SNAPSHOT隔离级别在逻辑上与 READ COMMITTED类似
不过在快照隔离级别下读操作不需要申请获得共享锁,所以即便是数据已经存在排他锁也不影响读操作。而且仍然可以得到和SERIALIZABLE与READ COMMITTED隔离级别类似的一致性;如果目前版本与预期的版本不一致,读操作可以从TEMPDB中获取预期的版本。

如果启用任何一种基于快照的隔离级别,DELETE和UPDATE语句在做出修改前都会把行的当前版本复制到TEMPDB中,而INSERT语句不需要在TEMPDB中进行版本控制,因为此时还没有行的旧数据

无论启用哪种基于快照的隔离级别都会对更新和删除操作产生性能的负面影响,但是有利于提高读操作的性能因为读操作不需要获取共享锁;

5.1SNAPSHOT

SNAPSHOT 在SNAPSHOT隔离级别下,当读取数据时可以保证操作读取的行是事务开始时可用的最后提交版本
同时SNAPSHOT隔离级别也满足前面的已提交读,可重复读,不幻读;该隔离级别实用的不是共享锁,而是行版本控制
使用SNAPSHOT隔离级别首先需要在数据库级别上设置相关选项

5.2READ COMMITTED SNAPSHOT

READ COMMITTED SNAPSHOT也是基于行版本控制,但是READ COMMITTED SNAPSHOT的隔离级别是读操作之前的最后已提交版本,而不是事务前的已提交版本,有点类似前面的READ COMMITTED能保证已提交读,但是不能保证可重复读,不能避免幻读,但是又比 READ COMMITTED隔离级别多出了不需要获取共享锁就可以读取数据

SqlServer【锁】注意事项

一、页锁实例

T1: select * from table (paglock)
T2: update table set column1='hello' where id>10

说明
T1执行时,会先对第一页加锁,读完第一页后,释放锁,再对第二页加锁,依此类推。假设前10行记录恰好是一页(当然,一般不可能一页只有10行记录),那么T1执行到第一页查询时,并不会阻塞T2的更新。


二、行锁实例

T1: select * from table (rowlock)
T2: update table set column1='hello' where id=10

说明
T1执行时,对每行加共享锁,读取,然后释放,再对下一行加锁;T2执行时,会对id=10的那一行试图加锁,只要该行没有被T1加上行锁,T2就可以顺利执行update操作。


三、整表锁实例

T1: select * from table (tablock)
T2: update table set column1='hello' where id = 10

说明
T1执行,对整个表加共享锁。 T1必须完全查询完,T2才可以允许加锁,并开始更新。


婚前最后一篇博文,希望婚后的自己还能坚持更新。

原文地址 https://www.cnblogs.com/kiba/p/9351119.html

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下右下角的【推荐】,非常感谢!

SqlServer注意事项总结,高级程序员必背。相关推荐

  1. Java程序员必背单词

    Java程序员必背单词 1.routput输出 2.math数学 3.try试图 4.catch抓住 5.throws抛出 6.abstract抽象 7.iterator迭代器 8.public公众的 ...

  2. 高级程序员必会的程序设计原则 —— 墨菲定律及防呆设计

    前言 如果你或你带领的团队经常会写出一些BUG,日常不是在解决BUG就是在解决BUG的路上,那么你的项目一定是应验了墨菲定律,并且在开发时并没有足够考虑防呆设计.团队越是疲于奔命,错的越是多. 简记 ...

  3. 高级程序员必会的程序设计原则 —— 复杂度守恒原则

    前言 软件设计上我们寄希望于能够让软件更简单.更容易维护,但是一面是害怕墨菲定律的应验,一方面又害怕遵循纯粹原则导致出现更多的缺陷.我们可以认为简单和复杂分别是跷跷板的两端,而它的支点就是复杂度守恒原 ...

  4. 引用管理器没有程序集_程序员必背英语单词不会,就别说你是程序员!

    Compile:编绎 Run:运行 Class:类 Object:对象 System:系统 out:输出 print:打印 line:行 variable:变量 type:类型 static:静态的 ...

  5. 成为高级程序员必学知识点!

    技术选型 网关:Nginx.Kong.Zuul 缓存:Redis.MemCached.OsCache.EhCache 搜索:ElasticSearch.Solr 熔断:Hystrix.resilien ...

  6. Java程序员必背英语单词70个

    Compile:编绎 Run:运行 Class:类 Object:对象 System:系统 out:输出 print:打印 line:行 variable:变量 type:类型 static:静态的 ...

  7. 程序员必背的es6面试题

    3.8 说⼀下 for in 与 for of 的区别?(80%) - For in 可以遍历对象 ⽽ for of 遍历对象会报错 - for in 遍历数组得到的数组的下表 ⽽ for of 遍历 ...

  8. java书籍_Java程序员必看的 13 本 Java 书籍!

    原文:Java程序员必看的 13 本 Java 书籍! 作者: java技术栈 关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,J ...

  9. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

最新文章

  1. platform_driver_register适配的两种方式及probe是否启动与硬件关系
  2. 神经网络基础知识总结
  3. 5界面怎么做窗帘拉动的效果_别让土味窗帘毁了你的家
  4. 用python中django创建网页终端直接关闭是什么问题_如何用Python Django创建网站?系列文章03(持续更新...)...
  5. LT8920无线通讯程序
  6. wds+mdt 分布式自动部署 操作系统
  7. POJ 3613 Cow Relays (floyd + 矩阵高速幂)
  8. 代码排版工具Artistic Style的使用(原创)
  9. mysql uroot p 报错,MySQL链接错误集。
  10. 最简单的基于FFmpeg的AVfilter的例子-纯净版
  11. 拓端tecdat|R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
  12. python修改app定位_5种萌新技巧定位APP_SIGN代码
  13. 计算机应用基础员工工资表,利用VBA编写Excel中的工资条与工资查询窗口
  14. 【Redis数据结构 List 类型】List 类型生产中的应用 消息队列、排行榜、老干妈的朋友圈、监控程序的实现
  15. MATLAB GUI中显示数学公式
  16. python 画三角函数_如何用python表示三角函数
  17. 阿里云centos部署jsonserver
  18. 至强cpu能装linux吗,至强四核CPU Xeon 安装Linux系统后 能利用到4个核吗?
  19. underscorejs-pluck学习
  20. 智能车学习日记【四】————环岛

热门文章

  1. is null和is not null运算符
  2. https ssl 非对称加密
  3. 题目:返回一个整数数组中最大子数组的和03
  4. 开发vue底部导航栏组件
  5. Property with #39;retain (or strong)#39; attribute must be of object type
  6. C++模板的特例化编译为多重定义问题
  7. Maven提高篇系列之(五)——处理依赖冲突
  8. linux perf - 性能测试和优化工具
  9. java.io.IOException: No space left on device
  10. MFC 使用datetimepicker获取时间