惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
量子位
美团技术团队
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
月光博客
月光博客

Mobility

从薅 token 到管 skill:我的 pks 工具落地实践 把笔记、微信读书、知乎装进 Obsidian:我基于llm-wiki知识中枢搭建实录 免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频 Agnes免费模型真能白嫖视频?我改造了ViMax来试试 教你薅token(二):构建agent无关的skills管理工作流 教你薅token:构建agent无关的AI工作流 用 AI Agent 完成 Hexo 主题迁移:从 Next 到 Butterfly 的全自动化实践 Vercel封禁163邮箱后,我是怎么恢复博客的 用LLM管理安全开发规范:一次llm-wiki实践 Vaadin框架教程:Java工程师的前端开发秘籍 hexo多语言方案总结及最佳实践 知乎增强工具-评论时间精确到秒 kubernetes是什么-实用向教程 怎么更科学的用知乎摸鱼 读书笔记《系统之美》,如何面对现实中的复杂问题 分布式系统设计中的通用方法 高并发解决方案很难吗?轻松聊清楚高并发设计 SSP,DSP,RTB,ADX都是什么? 讲讲互联网广告的概念与发展 从redolog,undolog到隔离级别,刨根问底,讲清楚事务和ACID java项目低学习成本使用kubernetes的实践经验 剧变中的2021-一个中年工程师的年终总结 kubernetes环境下做金丝雀发布的一种思路 prometheus教程: 一篇文章讲懂prometheus 实现一个简单的java版本高性能获取ip地址所属国家工具 iterm2配置ssh书签, 实现记住密码和自动登录 怎样做一个好的技术分享 云原生究竟是什么 读书笔记 稻盛和夫《干法》-思考应该怎样去工作 review的个人价值 户口?大厂?高薪?生活?聊聊应届程序员的职业选择
怎么理解数据库的四个隔离级别
2023-12-08 · via Mobility

数据库的事务隔离级别实际上是个很好理解的东西。

但是在一些劣质博客和公众号的努力下,这块知识已经成功的成为了一片烂八股。

接下来,只需要顺着我的思路,回答几个简答的问题,就可以将事务隔离级别理解透彻。

问:怎么实现不同事务直接的隔离?

对这个问题,当你处于讨论数据库事务隔离级别语境下时,是不是觉得很难回答?然后先把数据库三个字从脑子里剃掉,不同事务,也就是不同线程,操作数据怎么做隔离?答案是不是很简单?就是加锁。

问:锁有哪些类型

答:有很多种分类方式。在这里,我们把锁分成读锁和写锁。

问:加不同级别锁时,代码的表现会有什么区别?

到这里,原问题的答案是不是就呼之欲出了。

事实上,数据库事务为什么会有这些个不同的隔离级别,就是因为不同场景下使用了不同的锁。比前边说的稍微复杂的点,就是数据库中存在范围锁,在其他领域不太常用,就是把某一段数据整体锁住。

如果我们把所有操作能加的锁都加上,实际上就是串行化的操作了。这种方式隔离性当然很好,但性能就没法说了,所以一般也不会有人使用。

可重复读则是对涉及到的数据加读锁和写锁,并持有到事务结束,但不会加范围锁。这样就会出现幻读的问题,即一个事务内执行两次范围查询,如果这两次查询之间有新的数据被插入,就会导致两次范围查询的结果不一致。

读已提交和可重复读的区别是他的读锁会在查询操作结束之后立刻释放掉,这样,在事务执行过程中,已经查询过的数据是可以被其他事务任意修改的,所以也就会有不可重复读的问题。

读未提交级别下,则完全不会加读锁。这样造成的问题是,由于读操作时不会去申请读锁,所以反而会导致能够读到其他事务上加了写锁的数据,也就会出现脏读的问题。

当然,为了更好的平衡性能与隔离性,还有一些诸如MVCC之类的方案,用额外的存储来实现事务隔离的效果,这些是取巧解决80%问题的方式。

原文地址: http://lichuanyang.top/posts/9775/