事务的特性:
- 原子性:事务中的所有变更要么全部发生,要么一个也不发生。
- 一致性:事务要保持数据的完整性。
- 隔离性:多事务并行执行所得到的结果,与串行执行(一个接一个)完全相同。
- 持久性:一旦事务提交,它对数据的改变将被永久保留,不应受到任何系统故障的影响。
- 一致性:对事务整体目标的阐述
- 持久性:
- 硬件无损,可恢复:依托预写日志,WAL
- 硬件损坏,不可恢复:使用日志复制技术
- 原子性:只有支持和不支持,实现比较复杂,依赖于隔离性的并发控制技术和持久性的日志技术。
- 隔离性:分为多个隔离级别,较低的隔离级别就是在正确性上做妥协
不少人会将幻读与不可重复读混淆,这是因为它们在自然语义上非常接近,都是在一个事务内用相同的条件查询两次,但两次的结果不一样。差异在于,对不可重复读来说,第二次的结果集相对第一次,有些记录被修改(Update)或删除(Delete)了;而幻读是第二次结果集里出现了第一次结果集没有的记录 (Insert)。一个更加形象的说法,幻读是在第一次结果集的记录“间隙”中增加了新的记录。所以,MySQL 将防止出现幻读的锁命名为间隙锁(Gap Lock)。
写倾斜:同时有2个事务执行,一个事务根据查询条件A查出一批结果然后去修改,但是另一个事务会修改A,导致第一个事务的执行前提被修改。
一些分布式数据库产品的“一致性”实现情况:
数据一致性关注的是单对象、单操作在多副本上的一致性,事务一致性则是关注多对象、多操作在单副本上的一致性,分布式数据库的一致性是数据一致性与事务一致性的融合。
此文章为6月Day5学习笔记,内容来源于极客时间《分布式数据库30讲》