面试记录:事物和隔离级别

问题:数据库的隔离级别

虽然知道,但是没有刻意背过,面试一紧张直接忘了。


这个问题搞明白要从事物开始理解。

事物

所谓事物,就是将对数据库的一系列操作(比如 sql)在逻辑上构成一个整体,一次事物要么全部执行成功,要么全部执行不成功。
事物存在的原因,主要是针对因某些原因导致一系列的数据库操作执行不成功而造成的“跑了一半”的问题。
最经典的转账例子:小明要向小红转账1000块,需要的操作是先从小明的账户减少1000块钱,然后在小红的账号增加1000块钱。如果这个过程在中间断掉了,就有可能造成小明账号少了钱,但是小红账号资金没有增加。而如果这个操作使用了事物的话,小明的账号会回滚到事物执行前的状态,即他的账号没有减少资金的状态。
提交事物就是用 sql 中的 Commit 操作。

事物有四大特性(ACID)

原子性(Atomicity):即前面提到的事物是逻辑上的一个整体,是程序最小的执行单位,要么都跑完要么一点不跑。
一致性(Consistency):执行事物前后的数据保持一致,譬如前面提到的转账场景,小明转账给小红的1000块钱是一致的,既没有变多也没有变少。
隔离性(Isolation):并发执行下事物是“互不干涉”的,相互独立。
持久性(Durabilily):事物所造成的影响是永久的。

其他经验:事物的原子、隔离、持久保证了数据的一致,即数据的一致性是目的,其他三项是手段。

并发事物下会造成问题

数据库的操作事物一定是在并发状态下执行的,既然有并发和共享数据,那就一定会有出现线程安全问题的风险

脏读(Dirty read):一个事物1在执行过程中修改了数据,但是在这个事物1没有提交时,有一个事物2来查询了这条数据,因为事物1修改的数据还未提交,所以事物2读到的数据是“脏数据”,使用这种数据有可能会出错,这种情况即为 脏读。
丢失修改(Lost to modify):一个事物1在执行过程中修改了数据,在事物1还未提交时,事物2在执行中也修改了这条数据,这时由于事物1还没有提交,事物2对数据造成的修改相当于将事物1的修改给“丢失”掉了,这种情况称为丢失修改。
不可重复读(Unrepeatable read):事物1在执行中要读取一条数据两次及以上,但是在执行过程中这条数据被另一条事物2给修改了,造成了事物1在执行中多次操作同一数据情况不一致,这种情况称为“不可重复读”
幻读(Phantom read):事物1在执行中读取了几条数据,此时有事物2进行了插入或删除数据的操作,此时如若事物1再次用同样的查询条件读取数据,会发现两次读取的数据行数不一样,这种情况称之为幻读。

注意事项:
脏读和丢失修改的区别为,脏读只是第二条事物读到了事物1修改但是未提交的数据,没有对这个数据进行修改操作。而丢失修改时事物2修改了事物1修改但未提交的数据。所以二者区别为事物2有没有对事物1未提交数据的进行修改。
不可重复度和幻读类似,区别为不可重复读是事物2修改了行本身的数据,而幻读是事物2插入了新的行或删除了某些行而造成的事物1多次读取数据的条数不一致。

解决并发事物问题,SQL 标准定义的事物隔离级别

终于来到了问题,事物的隔离级别就是为了解决前面提到的并发事物问题。

读未提交(READ-UNCOMMITTED) : 最低隔离级别,字面意思允许读取未提交的数据。上述所有并发问题均没有预防效果。
读已提交(READ-COMMITTED):允许读取已经提交的数据,没有提交的数据不能读(如果读的话会读到之前提交的旧数据),所以不会有脏读问题,但是幻读和不可重复读仍可能发生
可重复读(REPEATABLE-READ):对同一字段的多次读取结果一致。除非读取字段的事物本身修改了数据,这种隔离级别仅有幻读风险
可串行化(SERIALIZABLE):最高隔离级别,所有事物同步执行,完全服从ACID。不会有并发事物问题的风险。

补充:MySQL 的默认隔离级别是可重复读
MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。串行化使用的是锁机制,其余的使用MVCC机制实现隔离级别。

隔离级别与锁的关系

在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在读取未提交的级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突

在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在读提交级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

SERIALIZABLE是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值