服务器事务的四大特性ACID包含哪些内容
事务是程序员在学习软件后端编程数据库开发的时候需要重点掌握的编程知识,而今天我们就一起来了解一下事务的四大特性ACID包含哪些内容。
事务的四大特性ACID分别是,A-原子性(Atomicity),C-一致性(Consistency),I-隔离性(Isolation),D-持久性(Durability)。一致性是终目的,原子性、隔离性、持久性是为了保证一致性所做的措施。所以我写的顺序并不是按照ACID来写的,将一致性放到了后,顺序就变成了,ADIC。
原子性(A)
原子性是指一个事务就是一个不可分割的工作单位,要么全部都执行成功,要么全部都执行失败,没有中间状态或是只执行一部分。
MySQL的InnoDB引擎是靠undolog(回滚日志)来实现的,undolog能够保证在事务回滚时,能够撤销所有已经执行成功的SQL。
undolog属于逻辑日志,它记录的是SQL执行相关的信息。当事务对数据库进行修改时,InnoDB会生成与之对应的undolog。如果事务执行失败或者调用的rollback,导致事务需要回滚,InnoDB引擎会根据undolog中的记录,将数据回滚到之前的样子。
一致性(C)
一致性是指在事务执行前后,数据的一致性,事务前后数据完整性没有破坏,并且都是合法的数据状态。
其中一致性的指标有:
索引的完整(索引,不重复等),数据列的完成(字段类型,长度,大小符合要求),外键约束等。
实现一致性的措施:
保证原子性,持久性,隔离性,如果这些特性都无法保证,那么一致性就也无法保证了。从数据库层面来看,除了前面那几个特性的保证外,对字段的一致性是有保证措施的,例如整型的字符不能传入,字符串、时间等格式,字符串的长度不能超过列的限制。但是在应用层面也是需要开发者自己来保证的,
例如:从A转账给B一部分金额,那么就要保证,从A从将金额扣除多少就要去给B增加多少金额,如果只扣除A的金额,而没有增加B的金额,是无法保证一致性的。
隔离性(I)
原子性和持久性都是基于单个事务内部的措施,而隔离性是只多个事务之间相互隔离,互不影响的特性。
我们都知道事务的隔离级别中严谨的是串行化(Serializable),但是隔离性越高,性能就越低,所以一般不使用串行化这个隔离级别。
持久性(D)
持久性是指事务一旦提交,对数据库的操作就是永久性的,接下来的其他操作和异常故障不应该对它有任何影响。
我们都知道MySQL的数据终是存放在磁盘中的,所以才会有磁盘的容量大小决定数据容量的大小。但是如果对MySQL的操作都是通过读写磁盘来进行的话,那么光是磁盘的I/O就够把效率大大的拉低了。
所以InnoDB为MySQL提供了缓冲池(BufferPool),BufferPool中包含了磁盘中部分数据页的映射。
当从数据库读取数据时,会先从BufferPool中读取数据,如果BufferPool中没有,则从磁盘读取后放入到BufferPool中。