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

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

闪电仓前置仓揭秘是什么?即时零售闪电仓能改变零售业态吗?炮研新零售揭秘闪电仓和前置仓新的玩法。图片网络CCFA2022高峰论坛2021年12月在武汉美团正式将即时零售供给新模式,专注线上经营超市便利店命名为美团闪电仓。你要加盟美团内部辅摩托罗拉MotoG13G23发布,售价179。99欧元起IT之家1月24日消息,除了MotoG535G和MotoG735G之外,摩托罗拉今天还发布了定位更低的MotoG13和MotoG23,两款手机都配备了5000万像素的相机传感器,高小米冲击高端已成99剩下1是关键小米为什么要做高端呢?是不是和让每一个人享受科技的乐趣冲突?大众对小米性价比的印象会影响小米做高端吗?小米生态链要去小米化自己做高端?以上的问题笔者会为大家在这篇文章中做详细的解答iPhone频繁曝出屏幕隐患,或走上三星老路,售后还得看国产iPhone14系列发布以来,热度和销量都只能说是中规中矩,虽然目前仍是国内高端销量第一,但对比往年的数据其实还是可以看出差距的,主要原因还是因为iPhone14系列较上一代提升并小米11升级MIUI14稳定版,流畅度飙升,发热问题改善了吗?经过一个多月的漫长等待,小米11系列终于迎来MIUI14稳定版更新,目前还处于小规模灰度内测阶段,预计最快下周将大规模推送。作为尝鲜升级的用户,除了流畅度飙升以外,发热与主板问题得iPhone14Pro不敢买!烧屏灵动岛,售后不如小米11不知道大家有没有发现,自从华为被打压之后,苹果就觉得自己这个品牌在国内没有了对手,于是开始没有底线的割韭菜行为。正是华为被打压那年,苹果发布了iPhone12系列手机,这个系列首次比特币终将崩盘的6个因素比特币在2022年3月29日冲上历史最高价47513USD,随后一路下跌,截止到2022年年底16576USD,2022年最高跌幅高达65,尽管波动很大,但许多投资者仍然对加密货币俄战斗机器人将投入实战?据美国新闻周刊网站1月18日报道,在俄罗斯官方媒体宣布将测试标记战斗机器人后,新闻周刊记者获悉,该机器人不大可能被派往乌克兰参加激烈战斗。报道称,15日,俄罗斯军事顾问组织沙皇之狼英特尔与SiFive合作推出RISCV开发板IT之家1月24日消息,美国RISCV芯片设计厂商SiFive与老牌x86芯片大厂英特尔达成合作,共同推出了一款名为HiFiveProP550的RISCV开发板。图源SiFive官苹果推出全新TodayatApple课程帮助用户保护个人隐私数据IT之家1月25日消息,随着人们对互联网个人信息私密性和安全性的关注,企业也开始投入越来越多的精力在隐私信息的安全与防护上。而每年的1月28日,是国际数据隐私保护日,为了庆祝国际数外媒苹果芯片出问题了据纽约时报报道,近日有消息称苹果正在开发的A11芯片出现问题,它可能无法正确处理高强度数据。外媒称,苹果的A11芯片已经在几个月前的WWDC上被宣布为下一代处理器。但现在似乎有越来
荣耀畅玩40Plus参数配置泄露天玑700芯6000mAh电池10月13日1930,荣耀将举行新品发布会,届时将发布新机荣耀X40GT。不过有消息称,荣耀还会在发布会上带来一款新机荣耀畅玩40Plus。据数码博主旺仔百事通透露,荣耀畅玩40P实用性NO。1!微蒸烤一体机我真的夸累了,煮妇七年,心头好大公开引言厨房电器不在多而在于精!这是楼主在厨房兢兢业业耕耘7年有余之后的肺腑之言。像楼主之前,真的很喜欢购置各种各样的厨房用品,总觉得能力不够,装备来凑,只要手里工具够多,就能做出好吃轮到库克头疼了!苹果新消息传来,媒体自作自受文C君科讯排版C君科讯头条号原创文章,禁止抄袭,违者必究轮到库克头疼了!苹果新消息传来,媒体自作自受2021年全年苹果公司的营业总收入为3658。17亿美元,同比增长33。44,这双11家电价格战大跳水,格力美的等大牌直降超1000,闭眼入都不亏说到双十一肯定是买家电最划算啦,很多家电在双十一几乎都是能以全年底价拿下。眼下即将到来的双十一节点,就是不少人换家电的绝佳机会。虽然活动多多,但是在挑选家电的时候不仅要看好价钱,还15003500元OPPO最好的三款手机,都能流畅用三年,双11入手很香今年的双十一将会在10月下旬开启第一波的预售,届时也将迎来一波换机热潮,不过从今年手机市场来看,可选择的机型非常丰富,要想享受到双11的优惠,还是得提前做好功课。就我个人而言,如果2022年双十一洗碗机选购攻略,六大选购要点,让你不交智商税网上流传着这么一个老梗,说买洗碗机的都后悔了,后悔什么呢?买晚了!生活中饭后洗碗,不仅是年轻人最不愿意做的家务活儿。即使是结婚多年的中老人的家庭,也常常会因为吃完饭谁去洗碗,而吵得清汤寡水亮相却堪称美貌屠杀,娜扎在她旁边简直用力过猛头条创作挑战赛前几天Vogue活动的女明星造型图大家看了吗?同样是全黑肃杀look春季型人小黄鸭,单薄的五官身材量感和愈发成熟凌厉的气质相矛盾。夏季型人也也子,高耸的颅顶和裹到脖子捷克超模伊娃赫兹戈娃(EvaHerzigova)的时尚杂志大片EvaHerzigova拍摄Elle美国版时尚杂志捷克顶级模特EvaHerzigova与摄影师ChrisColls和造型师AlexWhite在Elle美国版2022年6月7月号的时52岁的港姐李嘉欣真是越来越大胆了,穿一件粉色的吊带裙52岁的港姐MicheleMoniqueReis越来越大胆。穿粉色的有肩带的裙子看起来跟什么都没有一样。因为是肉色,她瞬间觉得太尴尬了。然而任何服装都很惊艳,她却偏偏选择了一件肉色这类衣服别再穿了,危害远比你想象的更大!伤身还费钱爱美之心,人皆有之。穿衣服,也是很有讲究的,有些衣物应该及时添加,但还有些衣服就别再穿了,危害比你想象的更大,没用还费钱,可能你家就有。下面先说要及时添加的衣物。1hr秋裤的重要性2022年10月15日国六929598号汽油,0号柴油最新零售价格今天是2022年10月15日星期四,距离下次调价还有9天的时间。油价和我们的生活息息相关,油价的涨跌影响着我们每一个人,下次调价成品汽油,柴油,是涨还是降呢?这个问题相信很多的朋友