数据库事务隔离级别

数据库事务共有四种隔离级别,从低到高为:读未提交(Read Uncommitted)--读已提交(Read Committed)--可重复读(Repeatable Read)--串行化(Serializable)

隔离级别越高,越能保证数据库的完整性和一致性,但同时对并发性能的影响也越大。

读未提交(Read Uncommitted)

就是字面意思,一个事务会读到其他事务未提交的内容。
比如数学老师正在录入成绩,实际成绩是10,但不小心给你录成了100,虽然还未提交,但已经写入了数据库,此时你去查询成绩,发现自己考了100,但是老师发现了错误,然后做了回滚,给你录入了正确的10然后做了提交,但你还以为自己是100。
这就是我们说的脏读,即读到了其他事务回滚前的数据

读已提交(Read Committed)

就是一个事务要等到另一个事务的更新操作提交后才能读,这样就解决了脏读问题。
比如我拿着银行卡去结账(我的事务开启),收费系统先检测到卡里有100块钱,此时我老婆用卡里的钱买了支口红并提交(老婆事务更新了卡里的钱),当我这边的收费系统开始扣款时再检测卡里的钱(在老婆事务提交后才能读),发现钱没了,这就导致了我的事务两次读取金额不一致。
这就不我们说的不可重复读,即两次相同的查询结果不一致。

可重复读(Repeatable Read)

就是在一个事务开启时,不允许其它事务进行修改操作。
比如上边那个例子,当我这边开始结账,不允许老婆事务对卡里的钱进行修改,需要等到我这边事务提交后才可以。这样就解决了不可重复读问题。

什么时候会出现幻读问题呢

幻读指执行两次查询,第二次的结果数据比第一次多
比如我老婆在花费100买完东西之后去查询银行卡消费记录,看到只有自己的100消费,准备打印出消费清单,此时我又消费200买了一个键盘并提交,我老婆打印出清单之后看到又多了一笔消费。
这就是我们说的幻读,即第二次查询结果比第一次多数据
综上我们发现,不可重复读对应的是修改操作(update),幻读对应的是添加操作(insert)

串行化(Serializable)

在该隔离级别下所有事务串行执行,可以避免脏读、不可重复读、幻读。但是效率也变得很低。所以串行化这个隔离级别一般不用。

posted @   程长新  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示