数据库事务 和 数据库隔离级别

本文深入探讨了数据库事务的概念,解析了并发事务可能引发的覆盖与查询问题,并详细阐述了四种数据库隔离级别:串行化、可重复读、读已提交和读未提交,以及它们如何解决事务并发带来的挑战。

起因

有一天同事问我,晨哥晨哥,什么是数据库的隔离级别,我,额,稍等,冒汗,以前看过,现在忘了。
有时间写一篇,下次再忘了还能看看。主要是自己看,顺便满足一下自己写作的欲望,如果你不小心看到了,证明咱俩有缘分,别因为我写的不好喷我。

什么是事务

你以为第一件事是介绍数据库隔离级别的定义吗,

错,

我们要先了解为什么有数据库的隔离级别。

我们了解一件新知识的时候先要明白它是解决什么问题的,数据库隔离级别解决的是事务并发的问题。

那么问题就来了,什么是事务。

数据库事务的概念比较简单,不考试的情况下用口语表达就是几个事件要么一起生效,要么一起失效
当然这个事件是数据库的事件,生活中的事儿不要硬往上套。😄,笑脸,手动滑稽。

不闹了,说正经的。正经脸。

并发事务的问题

事务并发会出现什么问题,这还不简单,两个覆盖问题,三个查询问题

这就有意思了,什么叫两个覆盖,三个查询。

咱们以最经典的银行卡余额为例。 假设有一张表,里面就一个字段 money , 咱来看一下并发事务的问题。

money
1000

第一种覆盖,因为回滚覆盖

时间点事务A事务B
T1开启事务开启事务
T2读到 1000读到 1000
T3给账号 + 500
T4账号余额 1500
T5提交事务
T6给账号 -500
T7账号余额 500
T8回滚事务
T9账号变 1000

最后丢失了事务 B 提交的记录。

第二种覆盖,因为提交覆盖

时间点事务A事务B
T1开启事务开启事务
T2读到 1000读到 1000
T3给账号 + 500
T4账号余额 1500
T5提交事务
T6给账号 -500
T7账号余额 500
T8提交事务
T9账号变 500

这是因为提交覆盖了 B 提交的事务。

第一种查询,查询到未提交的数据

时间点事务A事务B
T1开启事务开启事务
T2读到 1000
T3给账号 + 500
T4账号余额 1500
T5查询到账户余额 1500(脏读)
T6再给账户 +100回滚事务
T7账号余额 1600
T8提交事务
T9账号变 1600

因此,读到未提交的数据,也叫脏读。

第二种查询,查询到已提交的数据

时间点事务A事务B
T1开启事务开启事务
T2读到 1000读到 1000
T3给账号 + 500
T4账号余额 1500
T5提交事务
T6又读一次,变 1500 了
T7读两次效果不一样

这种读两次效果不一样的,也叫不可重复读。

第三种查询,查询到新插入的数据

时间点事务A事务B
T1开启事务开启事务
T2sum() 一下值是 1000
T3插入一条新的 1000 的记录
T4提交事务
T5再 sum() 一下值变成 2000 了

这种奇幻的效果就叫做幻读。

数据库隔离级别

既然事务并发会有这么多的问题,那我们设计系统的时候总得有所取舍,到底哪些现象是和合理的,哪些现象是不合理的要避免的。

数据库设计也是一样,这些问题有些是不合理一定要避免的,有些呢,在业务场景中是合理的,不能一棍子打死。

那到底哪些场景下是合理的哪些是不合理的,数据库把它设计成了一个可选项,就叫数据库隔离级别,供开发人员选择。

serializable (串行,建议记英文,中文表达不好)

所有事务操作都是串行的,一个事务执行完才执行下一下,这样肯定不会用问题,当然效率也是最慢。

repeatable read (可重复读)

就是读不到别的事务的对记录的更新【包括已提交和未提交】,能读到已经提交的插入。InnoDB 存储引擎通过多版本并发控制,MVCC 解决了幻读的问题。

read committed (读已提交)

就是能读到别的事务对记录的更新,也能读到已插入的记录

read uncommited (读未提交)(也叫脏读)

可以看到其他事务未提交的更新,插入也能看到。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值