VOL 162
25
2020-09
今天距2021年97天
这是ITester软件测试小栈第162次推文
点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 08:30准时推送,每月不定期赠送技术书籍。
微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信群”一起进群打怪。
本文3905字,阅读约需10分钟
1
什么是事务?
事务
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行,是一组不可再分割的操作集合。
通俗理解就是做一件事情的过程,事务封装了一条dml、或者多条dml语句。这个过程有两种结果:要么全部成功、要么全部失败。
2
什么是事务的ACID特性?
A
=Atomicity ,原子性:事务是数据库最小逻辑单位。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么全部执行成功 ,要么全部执行失败。任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。
C
=Consistency ,一致性:系统总是从一个一致性的状态转移到另一个一致性的状态。例如从 A 账户转账到 B 账户,不能因为 A 账户扣了钱,而 B 账户没有加钱,无论 A 和 B 怎么转账,系统中总额是固定的。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
I
=Isolation ,隔离性: 通常来说一个事务在完全提交之前,对其他事务是不可见的。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。
D
=Durability ,持久性:事务一旦提交,将永久存在,接下来的其它操作或故障不应该对其执行结果有任何影响。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
3
事务的隔离级别与对应的问题?
MySQL 的隔离等级对加锁有影响,所以在分析具体加锁场景时,首先要确定当前的隔离等级,分为以下几个等级:
读未提交
(Read Uncommitted ,简称 RU):可以读到未提交的读,基本上不会使用该隔离等级,所以暂时忽略。
读已提交
(Read Committed ,简称 RC):存在幻读问题,对当前读获取的数据加记录锁。
可重复读
(Repeatable Read ,简称 RR):不存在幻读问题,对当前读获取的数据加记录锁,同时对涉及的范围加间隙锁,防止新的数据插入,导致幻读。
序列化
(Serializable):从 MVCC 并发控制退化到基于锁的并发控制,不存在快照读,都是当前读,并发效率急剧下降,不建议使用。
隔离级别与对应问题矩阵如下所示:
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交 |
是 |
是 |
是 |