事务对于数据库而言,是对数据的一系列操作,比如增删改查,但事务具有
ACID
的特性,原子性,持久性,一致性,隔离性,是为了保证数据库的可靠和数据的一致。需要注意的是我们借助各种方法来保证事务的特性,比如锁就是实现事务隔离性的手段。
- 在阅读其它博客时有一点需要注意,MySQL的体系结构可以分为两层,MySQL Server层和存储引擎层(InnoDB、MyISAM、Memory、blackhole、TokuDB和MariaDB columnstore),对于不同的引擎可能对事务特性的具体实现的侧重点不同,希望注意辨别。
原子性
- 原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败,只是逻辑上的一体。
一致性
The database remains in a consistent state at all times — after each commit or rollback, and while transactions are in progress. If related data is being updated across multiple tables, queries see either all old values or all new values, not a mix of old and new values.
- 事务按照预期生效,数据的状态是预期的状态,正如官网说的遵守既定的规则不会发生混乱,一切井然有序。
持久性
- 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
隔离性
- 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
由事务并发带来的问题
探讨隔离性,对于事务并发很重要,因为要同时考虑性能和数据安全的因素。
脏读
- 事务A读取到了事务B未提交的数据(此时事务B已经修改了数据,如果事务B发生回滚,事务A读到的就是无效数据)。
不可重复读
- 在一个事务中多次读取一条数据,结果不同(另一条事务把数据修改并提交了)。
幻读
- 一个事务多次查询发现数据集不同(有别的事务插入了新的数据)。
可以看到的是脏读因为有无效数据影响最大,不可重复读虽然读到了不一致的数据,但数据是有效的,幻读只是结果集的范围发生了变化,数据均有效,影响最小。
事务的隔离级别
为了解决上述问题,把事务划分为不同的隔离级别,性能依次下降,安全性依次提高。
读未提交
- 不解决任何问题
读已提交
- 只允许已提交的数据
可重复读
- 保证事务在多次读取时,数据一致。
串行化
- 事务完全串行执行,避免了所有的并发问题,性能最低。
当然这些隔离级别还需要各种机制来保证。比如各种锁,MVCC等。