范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SQLSERVER的四个事务隔离级别到底怎么理解?

  一:背景1. 讲故事
  在有关SQLSERVER的各种参考资料中,经常会看到如下四种事务隔离级别。 READ UNCOMMITTED READ COMMITTED SERIALIZABLE REPEATABLE READ
  随之而来的是大量的文字解释,还会附带各种 脏读, 幻读, 不可重复读 常常会把初学者弄得晕头转向,其实事务的本质就是隔离,落地就需要锁机制,理解这四种隔离方式的花式加锁,应该就可以入门了,那如何可视化的观察 锁 过程呢?这里借助 SQL Profile 工具。 二:四种事务隔离方式1. 测试数据准备
  还是用上一篇创建的 post 表,脚本如下:  CREATE TABLE post(id INT IDENTITY,content char(4000)) GO  INSERT INTO dbo.post VALUES("aaa") INSERT INTO dbo.post VALUES("bbb") INSERT INTO dbo.post VALUES("ccc"); INSERT INTO dbo.post VALUES("ddd"); INSERT INTO dbo.post VALUES("eee"); INSERT INTO dbo.post VALUES("fff");
  有了测试数据之后,我们按照隔离级别 高 -> 低 的顺序来观察吧。 2. SERIALIZABLE 事务
  事务串行化 其实很好理解,如果要在 C# 中找对应那就是 ReaderWriterLock,读写事务是完全排斥的,接下来把 SQLSERVER 的隔离级别调整为 SERIALIZABLE。  SET TRAN ISOLATION LEVEL SERIALIZABLE GO  BEGIN TRAN  SELECT * FROM dbo.post WHERE id=3 COMMIT
  打开 profile,选择 lock:Acquired, lock:Released,SQL:StmtStarting 选项,开启观察。
  从图中可以清楚的看到,SQLSERVER 直接对 post 附加了 S 锁,在 COMMIT 之后才真正的释放,在 S 锁期间, Insert 和 Update 引发的 X 锁是进不来的,所以就会存在相互阻塞的情况,也许这就是串行化的由来吧。
  sqlserver 是一个支持多用户并发的数据库程序,如果锁粒度这么粗,必定给并发带来非常大的负面影响,不过文章开头的那三个指标 脏读, 幻读, 不可重复读 肯定都是不会出现的。 2. REPEATABLE READ 事务
  什么叫 可重复读 呢?简而言之就是同一个 select 查询执行二次,不会出现记录修改的情况,在真实场景中两次 select 查询期间,可能会有其他事务修改了记录,如果当前是 REPEATABLE READ 模式,这是被禁止的,接下来的问题是如何落地实现呢?我们来看看 SQLSERVER 是如何做到的,参考sql 如下:  SET TRAN ISOLATION LEVEL REPEATABLE READ GO  BEGIN TRAN  SELECT * FROM dbo.post WHERE id=3 COMMIT
  这个图可能有些朋友看不懂,我稍微解释一下吧,数据库由数据页Page组成,数据页由记录RID 组成,有了这个基础就好理解了, SQLSERVER 会在事务期间把 1:489:0 也就是 id=3 这个记录全程附加 S 锁,直到事务提交才释放 S 锁,在事务期间任何对它修改的 X 锁都无法对其变更,从而实现事务期间的 可重复读 功能,如果大家不明白可以再琢磨琢磨。
  这里有一个细节需要大家注意一下,可重复读 的场景下会出现 幻读 的情况,幻读就是两次查询出的结果集可能会不一样,比如第一次是 3 条记录,第二次变成了 5 条记录,为了方便理解我来简单演示一下。 会话1  SET TRAN ISOLATION LEVEL REPEATABLE READ GO  BEGIN TRAN  SELECT * FROM dbo.post WHERE id >3 WAITFOR DELAY "00:00:05" SELECT * FROM dbo.post WHERE id >3 COMMIT  会话2
  在会话1 执行的 5s 期间执行 会话2 语句。  BEGIN TRAN  INSERT INTO dbo.post(content) VALUES ("gggggg") COMMIT
  稍等片刻之后,会发现多了一个 记录7 ,截图如下:
  3. READ COMMITTED
  提交读 是目前 SQLSERVER 默认的隔离级别,它是以不会出现 脏读 为唯一目标,何为脏读,简而言之就是读取到了别的事务未提交的修改数据,这个数据有可能会被其他事务在后续回滚掉,如果真的被其他事务 回滚 了,那你读到了这样的数据就是 错误 的数据,可能会给你的系统带来非常隐蔽的 bug,为了说明这个现象,我们用两个会话来测试一下帮助大家理解。 会话1
  在这个会话中,将 id=3 的记录修改成 zzzzz  BEGIN TRAN  UPDATE dbo.post SET content="zzzzz" WHERE id=3 WAITFOR DELAY "00:00:05" ROLLBACK  会话2
  这个会话中,重复执行sql查询。  BEGIN TRAN  SELECT * FROM dbo.post WITH(NOLOCK) WHERE id =3   -- 脏读啦 WAITFOR DELAY "00:00:05" SELECT * FROM dbo.post WITH(NOLOCK) WHERE id =3   -- 正确的数据 COMMIT
  为了实现脏读这里加了 nolock 关键词,从图中明显的看到,获取的 zzzzz 数据是错误的,在一些和钱打交道的系统中是被严厉禁止的。
  有了这些基础再理解 可提交读 可能会容易些,是不是很好奇 SQLSERVER 是如何实现的呢? 参考 sql 如下:  SET TRAN ISOLATION LEVEL READ COMMITTED GO  BEGIN TRAN  SELECT * FROM dbo.post  WHERE id =3   COMMIT
  从加锁流程看,SQLSERVER 会逐一扫描数据页附加 IS 锁,扫完马上就释放,不像前面那样保持到 COMMIT 之后,如果找到记录所在的 Page 时,会对下面的所有记录附加 S 锁,这个时候 X 锁就进不来了,这就是它的实现原理,大家可以把刚才的 脏读 的sql中的 nolock 去掉试试看,两次读取结果都是一样的。 4. READ UNCOMMITTED
  本质上来说 READ UNCOMMITTED 和 nolock 的效果是一样的,会引发脏读现象,主要是因为 READ UNCOMMITTED 根本就不会对表记录使用任何锁,参考sql如下:  SET TRAN ISOLATION LEVEL READ UNCOMMITTED GO  BEGIN TRAN  SELECT * FROM dbo.post  WHERE id =3   COMMIT
  接下来观察 sqlprofile 的输出。
  可以看到 READ UNCOMMITTED 只会对表和堆表结构这种架构附加锁,不会对表中记录附加任何锁,也就会引发 脏读 现象。 三:总结
  其实 SQLSERVER 还有带版本的 SNAPSHOT 隔离级别,在真实场景中往往会给 TempDB 造成很大的压力,这里就不介绍了。
  相信通过 Profile 观察到的加锁动态过程,会让大家有更深入的理解。

男篮世预赛周琦117吴前18分收官战中国轻取伊朗北京时间2月26日,男篮世预赛亚大区第二阶段F组,中国男篮主场以8674轻取伊朗,以10胜2负的战绩,结束世预赛的征程。伊朗尽管输给了中国队,但由于竞争对手哈萨克斯坦也输给了澳大利前NBA球星韦德的儿子完成变性,这波生儿育女,网友炸锅了这两天,许久没有出现在公众视野的前NBA篮球巨星,德怀恩韦德(DwyaneWade)又有了新动向经过近四年的努力,他又多了一个女儿Zaya。只不过这女儿不是新生的,而是由儿子变来的男篮新教练不如杜锋,3方面被完全碾压,姚明跟央视却说出了原因前言男篮新教练完全输给杜锋,香港球迷直呼更换人选,央视以及姚明更是说出了真正的原因。提到乔尔杰维奇在3方面的带队能力,确实比不过杜锋,我们不妨和大家聊聊以下的4个点。第一个点,乔尔解纷一件事更便捷高效!宝山区司法局零距离化解矛盾纠纷为深化矛盾纠纷多元化化解机制建设,宝山区司法局依托随申办和一网通办平台的解纷一件事在线申请,整合全区各类纠纷资源,实现矛盾纠纷一口申请,做到零距离化解矛盾纠纷。01解纷网络再创新平2月28日凌晨,中国传来19个消息,两会提案全民免费医疗成热议!1两会召开在即,张其成委员提案实行全民免费医疗政策。19专家说本次医保改革,明明是好事,为什么网上有这么多人发帖反对?对此,你们大家怎么看?网友1坚决反对这次医改,昨天我请假去医院年仅11岁!滑雪小将周苡竹收获国际赛事亚军来源澎湃新闻2月25日,一位中国少女在知名冬季运动国际赛事WinterDewTour上崭露头角。在女子单板滑雪U型池项目的争夺中,年仅11岁的周苡竹以91。67分的成绩取得亚军,与一个马拉松爱好者的自白(中)北马完赛后,我们在奥体中心水立方游玩了一下,就坐摆渡车送我们回宾馆就餐,一般跑马的人活动量大,出汗多一些,都喜欢菜偏咸一点。排骨炖萝卜红烧肉炸鸡腿五香肉大部分是硬菜,花里胡哨的菜基格科微2022年净利4。46亿元同比下降64。58中证智能财讯格科微(688728)2月27日晚间披露2022年度业绩快报,公司实现营业收入59。44亿元,同比下降15。1归母净利润4。46亿元,同比下降64。58扣非净利润3。6艾融软件2022年净利5094。5万元同比增长1。12中证智能财讯艾融软件(830799)2月27日晚间披露2022年度业绩快报,公司实现营业收入6。04亿元,同比增长43。41归母净利润5094。5万元,同比增长1。12扣非净利润4第三次手术!能写字,是这只小手新学期的愿望日夜笑泪生死如果时光可以倒流伤痛会不会远离人生无常以爱之名8099999特别策划云云众生云云众生春启新程在经历了漫长的线上学习以后,这个学期,随着防治工作的调整,学生们开始重返校园扛不住了?美芯企业集体暴雷,外媒断供华为的代价众所周知,华为手机业务近些年经历了过山车,从超越苹果的巅峰时刻,再到如今连前十都排不进去,让人感到惋惜。之所以出现这种情况,主要就是因为老美不断修改规则,导致华为无芯可用。但正如比
收藏宝贵精神财富用镜头记录老兵红色记忆来源央视网央视网消息安不忘危,治不忘乱。近年来,全国多地都在开展口述历史相关工作。山东省2021年启动了革命老兵红色记忆工程,2。8万余名老兵在镜头前讲述了他们的战斗故事。青岛警备轰20要来了?中航试飞院召开重点机型大会,战略意义明确提及上月中福建号航母在江南造船的顺利下水,算是将我国军迷们对今年造船工业与海军的期待,给一口气满足了在新航母如期到来之后,另一款空军的战略装备,航空工业的轰20什么时候能成功首飞,就成这七种婚姻状态,最容易出轨如果你的婚姻存在以下7种婚姻状况,那么要重视起来,抓紧时间解决问题,守护好自己的婚姻。一夫妻双方有一方是大男子主义或女权主义者。在一段婚姻里,如果有一方是大男子主义或女权主义者,那周杰伦新歌遭差评!嗓子状态大不如前,杂糅感强全是过往作品影子周杰伦新歌上线啦!这首率先发布的新歌严格说是他新专辑最伟大的作品的先行曲,一般来说先行曲主要为专辑预热,某种程度上代表着整张专辑的基调,重要程度不亚于专辑主打,而且基本都是免费的,我的牙龈总是长脓包,该怎么办?生活中总是会遇到这样的问题1我牙龈上长了脓包,我能自己刺破吗?2我也没感到疼痛,就是反复起脓包,能经常吃消炎药吗?3起脓包不就是上火了吗?等等首先,我们先了解一下引起脓包的原因有哪再见,杜兰特!篮网交易闹剧再次升级,蔡崇信想要225前锋北京时间7月8日,NBA自由市场正在进行,其中前锋坎卡已同意与掘金达成三年续约,最后一年为球队选项,继续辅佐约基奇,哈姆透露,勒布朗是绝无仅有的,他向阿克伦的孩子们展示如何成功。就杜兰特报价汇总,篮网应正确评估杜兰特的交易价值自从7月1日,布鲁克林篮网队的核心凯文杜兰特向球队提出交易申请后,杜兰特的去向一直是全联盟的焦点,也已经有不少球队表达了想得到杜兰特的想法,但无奈篮网的要价过高,导致关于杜兰特的交篮网好消息!3大新援加盟,杜兰特或留队,3巨头豪阵仍有冲冠希望布鲁克林篮网队因为欧文离队引发了一连串的拆队反应,头号球星凯文杜兰特此前也申请交易离队,但是现在情况发生变化。欧文的交易并没有想象之中那么容易完成,湖人女老板珍妮巴斯扣扣搜搜,也舍官宣!76人达成两笔签约,杜兰特有新消息,森林狼完成10换1交易北京时间7月7日,NBA自由市场正在进行,其中洛杉矶湖人与休斯敦火箭印第安纳步行者,商讨引进埃里克戈登希尔德的事情,康奈利透露犹他爵士并未甩卖戈贝尔,他在市场上不乏追求者。就在刚刚连签2人!就是针对森林狼,夺笋啊自由球员这才开始了几天基本就没什么大鱼了,剩下的都是些小鱼小虾似的签约。一心冲着摆烂去的马刺今天终于又有了两笔签约,一年合同签下了吉昂,以及认领了之前被雷霆裁掉的罗比。前两天罗比被密春雷失联半年后回归,继续担任公司董事长,妻子董卿被网暴两月7月6日,网上爆出一则消息,海医董事长密春雷在失联半年后终于回归,并继续担任董事长一职。随后,该公司关于董事长正常履行职责的公告在网上曝光。据公告显示,董事长密春雷是因为个人原因,