事务:事务是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够对数据库应用该组查询的全部语句,那么就执行改单元的全部语句。如果该单元的任何一条语句崩溃或者其它原因无法执行,那么所有的语句都不会执行。简而言之,该单元的语句要么全部执行,要么全部不执行。
ACID 测试:
原子性(atomicity):
一个单元的操作要么全部执行,要么全部不执行。不能只执行其中一部分。
一致性(consistency):
数据库总是从一个一致性状态转换到另一个一致性状态。
一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。
举个栗子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。
原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
在未提交读的隔离级别下,会造成脏读,这就是因为一个事务读到了另一个事务操作内部的数据。ACID中是的一致性描述的是一个最理想的事务应该怎样的,是一个强一致性状态,如果要做到这点,需要使用排它锁把事务排成一队,即Serializable的隔离级别,这样性能就大大降低了。现实是骨感的,所以使用隔离性的不同隔离级别来破坏一致性,来获取更好的性能
隔离性(isolation):
通常来说是指在一个事务完成提交以前,对于其它事务是不可见的。
持久性(durability):
一旦事务提交,所修改的数据会永远保存在数据库中
事务的四种隔离级别
未提交读(READ UNCOMMIT):对于事务,即使没有提交,其它事务也是可以读取的。事务读取未提交的数据被称为脏读(dirty read),脏读就是指当一个事务bai正在访问数据,并且du对数据进行了修改zhi,而这种修改还没有提交到数据库dao中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
提交读(READ COMMIT):也叫不可重复读(nonrepeatable read),一个事务在提交开始到提交前对数据所做的修改对于其它事务是不可见的。两次查询的结果可能得到不同的值。
可重复读(REPEATABLE READ):解决了脏读的问题,但是还是会产生幻读(Phantom Read)问题,所谓幻读是指在事务读取范围值的时候,如果另一个事务插入新的行,在前面的事务再次读取就会产生幻行。
可串行行(SERIZLIABLE):在每一行上都加锁,通过强制执行事务的串行执行,解决了幻读问题,但会导致执行很慢。
死锁:指的是多个事务互相占据对方的锁,导致事务都无法拿到资源,从而陷入无限循环之中。InnoDB比较号的解决方法是将执行了行数比较少的行级排他锁事务进行回滚。
InnoDB存储引擎
(1)InnoDB的数据存储在表空间中,表空间是InnoDB管理的一个黑盒子,由一系列的数据文件组成;
(2)InnoDB采用MVCC来支持高并发,并且实现了四个标准隔离级别;
(3)InnoDB是基于聚集索引实现的;
(4)如果需要事务支持的话,InnoDB是非常好的选择,如果不需要事务支持,并且有很多select和insert操作的话,MyISAM是个更好的选择。
(5)还有包括在线热备份和数据崩溃恢复等优点