面试中数据库事务的几个关键点
事务特性
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.