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

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 观察到的加锁动态过程,会让大家有更深入的理解。

安翰科技立冬后胃疾病多发,磁控胶囊胃镜助您舒适查胃孝经纬曰斗指乾,为立冬,冬者,终也,万物皆收藏也。又有老话说得妙,冬至吃饺子,不冻耳朵。让我们跟着本草纲目学菜谱,把养胃的好食材藏进饺子里,温暖了胃部,便能暖遍全身!第一道白菜猪肉入冬吃苦,来年不苦,建议少吃苦瓜,多吃4苦,舒服过冬立冬节气到来,意味着正式入冬了。老话常言,入冬吃苦,来年不苦,说的是入冬后,要多吃些苦味食物,这背后有什么讲究呢?这是因为在传统观点里,冬季肾经旺盛,肾主咸,心主苦,肾水克心火,多黄痰是热,干咳是燥,白痰是寒,3个中成药,清热散寒,润燥止咳嗓子有痰,黏黏腻腻的咯在喉咙处,还总是吐不完,有些人咳出来的是黄痰,有些人呢咳出来的是白痰,还比较稀还有些人呢总是干咳,没有痰。这是为什么呢?今天屈医生就从痰的颜色来给你讲清楚,并李少莉事件的调查结果出来,也许和你们想象的有反差人们为什么这么不待见,不喜欢她呢?网友说不是打扮问题是业务能力问题业务能力这样差为什么一路走来这么顺风顺水为什么一路都显示学霸模式为什么都是这么爱学习的履历呢为了还她一个清白,必须远舢智能勇夺第四届中国工业互联网大赛二等奖11月6日,第四届中国工业互联网大赛在沈阳举办,来自全国的众多参赛企业围绕计划调度生产作业仓储配送质量管理设备管理等携带作品依次路演,经现场专家仔细斟酌研究对比合理打分后决出胜负。时代巨人马化腾马云刘强东媒体人周刊今天我们来讲一下,关于时代的巨人。第一位马化腾有人问,马化腾是谁?年轻一点的肯定不知道,因为短视频时代,早已经分割了人们的注意力。但是说起QQ,那肯定很多都有。没错,QQ(第五届进博会)进博透视进博会让老挝优质产品搭上中国高质量发展快车新华社上海11月7日电进博透视进博会让老挝优质产品搭上中国高质量发展快车新华社记者骆珺许东远周蕊千年的老茶树,就这么砍了太可惜了在第五届中国国际进口博览会食品及农产品展区,身穿老挝中国金茂前10月累计签约销售金额1231。8亿元中国金茂11月7日在港交所公告,2022年10月份,公司及其附属公司取得签约销售金额132亿元(其中包含(如有)长沙梅溪湖国际新城项目南京青龙山国际生态新城项目寧波生命科学城项目嘉95后保加利亚小伙中国创业记用艺术对话中东欧中新网宁波11月6日电(记者林波)高伟义是我的中文名,高是高大的高,伟是伟大的伟,义是正义的义。来自保加利亚的95后小伙StoyanValentinovGegovski(斯托扬瓦连我国数字职业种类明显增长还需多措并举提升人才质量适应产业发展,满足实际需要打造数字技能人才的成长摇篮本报记者高乔打造数字技能人才的成长摇篮,已成为中国高技术人才队伍建设中的重要一环。中共中央办公厅国务院办公厅日前发布关于加强新时颈椎不好的人,身上会有这6种症状,别不当回事颈椎病是一种常见的疾病,发病率高,症状多样而复杂。大多数颈椎病患者主要是一种症状或多种症状的混合。无论哪种颈椎病,其症状往往与颈部活动有明显的关系,坐着或站着加重,躺着时减少或消失
双十一快递陆续到货,收快递正确打开方式11月13日,国家邮政局印发通知,要求进一步优化措施科学精准做好行业疫情防控工作。通知要求,要进一步优化完善行业疫情防控措施。要抓好各项制度规范落实。各级邮政管理部门各邮政快递企业湖人喜讯,小卡正式归队,欧文向现实低头,篮网酝酿大交易NBA常规赛激战正酣,伤病潮提前来袭。过去一夜,多支球队传来噩耗,多位大将因伤挂起免战牌。其中,热火队的尤特赛文将接受左脚踝手术,预计伤停3个月骑士队的米切尔右脚踝扭伤,无缘对阵森A股头条重磅!金融16条措施支持房地产市场平稳健康发展Web3。0概念龙头天地在线停牌核查要闻速递1权威回应!国家卫健委二十条优化措施更科学精准,不是放松躺平11月12日,国务院联防联控机制举行新闻发布会,针对社会关切问题作出权威回应。国家卫生健康委新闻发言人宣传司副司晨读丨11月14日,关注健康每一天健康提醒植物油作为常用油比动物油健康油在日常饮食中是个重要角色,江苏省扬州市第一人民医院消化内科副主任医师支杰华提醒,植物油作为常用油比动物油更健康。支杰华指出,植物油中含有的是单2022昆明高原半程马拉松开跑奔跑春城花都邂逅健康之城图为2022昆明高原半程马拉松在昆明会堂开跑。记者赵伟摄选手在比赛中。选手参与亲子跑。选手冲过终点。昆明信息港讯(昆明日报记者王姗)11月13日,2022昆明高原半程马拉松(以下简李彦宏过去一年人工智能发生了方向性改变11月9日,百度创始人董事长兼首席执行官李彦宏在出席2022联想创新科技大会时表示,过去一年,无论是在技术层面还是在商业应用层面,人工智能都有了巨大的进展,有些甚至是方向性的改变。大数据解读2022双十一,超2000万的晚八人在看自2009年11月11日淘宝商城开启促销活动至今,双十一已经不再是一个简单的人造节日,而是成为消费者心中消费节点的象征。与往年比起来,今年双十一购物节延续了前几年的双节棍打法从曾经我国累计培育专精特新中小企业超6万家(新数据新看点)来源人民日报本报北京11月13日电(记者王政)记者近日从工信部获悉党的十八大以来,我国中小企业发展取得显著成效,创新能力加速提升,累计培育8997家专精特新小巨人企业6万多家专精特勇士官宣克莱!篮网交易神射,湖人做出决定,谁注意库里四项数据本赛季NBA常规赛打到了现在这个阶段,其实对各支球队相当的考验。有的球队经历失败之后触底反弹,有的球队仍旧停留在原地。不得不说,NBA常规赛就是如此,总会给你带来惊喜,但也有失望。关注女性健康龙眼肉为了自身健康,女性除应科学摄取常规的基础性营养如蛋白质脂肪糖类维生素矿物质水膳食纤维等之外,还可以根据自己的年龄身体状况和特定需求,选择一些药食同源的中药品种。今天就向您介绍其中的24城入选试点3年住建部公布智能建造试点城市名单住房和城乡建设部近日印发通知,选取北京天津重庆等24个城市开展智能建造试点,积极探索建筑业转型发展的新路径,试点时间为期3年。近年来,我国建筑业生产规模不断扩大,国民经济支柱产业的