数据库事务( transaction)是访问并可能操做各类数据项的一个数据库操做序列,这些操做要么所有执行,要么所有不执行,是一个不可分割的工做单位。事务由事务开始与事务结束之间执行的所有数据库操做组成mysql
原子性是指事务是一个不可分割的单位,要么都发生,要么都不发生
想要保证事务的原子性,就须要在异常发生时,对已经执行的操做进行回滚,而在 MySQL 中,恢复机制是经过回滚日志(undo log)实现的,全部事务进行的修改都会先记录到这个回滚日志中,而后在对数据库中的对应行进行写入。
回滚日志除了可以在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息,它还可以在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还可以马上经过查询回滚日志将以前未完成的事务进行回滚,这也就须要回滚日志必须先于数据持久化到磁盘上,是咱们须要先写日志后写数据库的主要缘由。
回滚日志并不能将数据库物理的恢复到执行语句或事务以前的样子,他是逻辑日志。sql
一致性是指应用从一个正确的状态到另一个正确的状态。ACID就是经过AID来保证C的。如何理解正确的状态呢?正确的状态就是咱们须要约定的一些约束,好比张三帐户有90元,若是他买东西须要花费100元,则买完之后帐户余额就是-10元,那么-10元是否是一个正确的状态呢?答案是的。这是由于咱们并无约定帐户字段不能为负。
多个事务并行处理时,相互应该没有影响
隔离级别:
1.读未提交
2.读已提交
3.可重复读(innodb)
4.串行化数据库
脏读:读到其余事务未提交的更新数据,
幻读:一个事务,读取两次,获得的记录条数不一致
不可重复读: 重复读取后数据不一致多线程
其实也是多线程问题。因此使用并发控制机制,限制不一样事务对同一资源的读写。这里介绍三种最重要的并发控制器机制的工做原理。
1.锁
mysql提供两种锁,共享锁和互斥锁,也叫读锁和写锁
2.时间戳
使用时间戳的话,就是乐观锁的实现方式,写入数据的时候先对数据进行修改,再判断时间戳是否变化过,若是没有,就更新,变了的话,就生成新的时间戳再次更新数据
3.多版本和快照隔离
经过维护多个版本的数据,数据库能够容许事务在数据被其余事务更新 时,去读取旧版本的数据。并发
持久性是指一旦事务被提交,他对数据库中数据的改变就是永久性的。
Active:事务的初始状态,表示事务正在执行;
Partially Commited:在最后一条语句执行以后;
Failed:发现事务没法正常执行以后;
Aborted:事务被回滚而且数据库恢复到了事务进行以前的状态以后;
Commited:成功执行整个事务;spa