ACID
ACID就是我们常说的事务的特点。
-
原子性(Atomic)
一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。 -
一致性(Consistency)
一致性指事务将数据库从一种状态转变为下一种一致的状态。事务开始前和结束后,数据库的完整性约束没有被破坏。一致状态的含义即数据库中数据应满足完整性约束。举个栗子,用户A和B的总资产加起来一共200元,他们之间相互转账,但不管他们怎么转账,事务结束后两人的总资产加起来应该还是200元。这就是事务的一致性。事务是一致性的单位,如果事务中某操作失败了,系统可以自动撤销事务回到初始化状态。 -
隔离性(Isolation)
隔离性有其他称呼如并发控制(concurrency control)、可串行化(serializability)、锁(locking)等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事物都不可见,通常使用锁来实现。当前数据库系统都提供了一种粒度锁的策略,允许事务仅锁住一个实体对象的子集,以此来提高事物之间的并发度。 -
持久性(durability)
事务一旦提交,其结果是永久性的。即时发生宕机数据库也能恢复。但若不是数据库本身发生故障,而是一些外部原因如RAID卡损坏等,数据可能会丢失,所以持久性保证事务系统的高可靠性(High Reliability),而不是高可用性(High Availability)。对于高可用性的实现,事务本身不能保证,需要一些系统共同配合来完成。
底下有关于如何实现ACID的参考文章。
并发事务
并发事务中容易出现的问题有:
- 脏读
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 - 丢失修改
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 - 不可重复读
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 - 幻读
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
其实它们受隔离级别影响:
- 读取未修改
- 读取已修改
- 可重复读(InnoDB默认,所以支持事务)
- 可串行化
自己的思维真的太菜了。。有时候记住了哪个引擎有什么优势,但是又不知道优势咋来的,知道它有什么结构,又不知道结构实际上有什么作用。。革命尚未成功,同志仍需努力呀。
参考文章
Mysql之InnoDB
如何实现ACID