面试中数据库事务的几个关键点

发布于 2022-4-13 15:11
浏览
0收藏

事务特性

1、原子性(Atomicity)

事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency)

事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation)

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability)

事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

并发问题

1. 更新丢失

两个事务同时操作相同数据,后提交的事务会覆盖先提交的事务处理结果,更新丢失通过乐观锁就可以解决。

2、脏读

事务A读取到了事务B已经修改但尚未提交的数据,然后B回滚操作,那么A读取到的数据是脏数据

3、不可重复读

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

4、幻读

事务A读取到了事务B提交的新增数据。系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

隔离级别

1. 读未提交

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。

读取未提交的数据,则会发生赃读。

2. 读已提交

一个事务多次读取的过程中,另一个事务可能对同一条数据做修改并提交,导致前一个事务多次读取到的数据不一致,则会发生不可重复读。

一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别,但非MySql。

3. 可重复读

确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,并且多次读结果永远是第一次读取的结果(快照版本)。此级别依然会发生幻读,这是MySql的默认隔离级别。

4. 可串行化

通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

本文转载自微信公众号「微观技术」

原文链接:https://mp.weixin.qq.com/s/caAFVWMssz6KmML1pYQmLw.

收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐