简单来讲,事务就是要保证一组数据库操做,要么所有完成,要么所有失败。mysql
为何要有事务
数据库中的数据是共享资源,所以数据库系统一般要支持多个用户的或不一样应用程序的访问,会出现并发存取数据的现象。面试
数据库系统必须对这种并发操做提供一种相应的处理机制来保证,访问彼此之间不受任何干扰,从而保证数据库的正确性不受到破坏,这种处理机制称为“并发控制”。其中事务就是为了保证数据的一致性而产生的一种概念和手段。sql
事务特性
为了保证数据库的正确性与一致性,事务要具备4个特性:数据库
- 原子性(atomicity):一个事务应该是一个不可分割的工做单位,事务中包括的操做要么都成功,要么都不成功。
- 一致性(consistency):事务必须是使数据库从一个一致性状态变成另外一个一致性状态。一致性与原子性是密切相关的。
- 隔离性(isolation):一个事务的执行不能被其余事务干扰。即一个事务内部的操做及使用的数据在事务未提交前对并发的其余事务是隔离的,并发执行的各个事务之间不能互相影响。
- 持久性(durability):一个事务一旦成功提交,它对数据库中数据的改变就应该是永久性的。
并发事务存在的问题
若是不考虑事务的隔离性,会发生如下几种问题:并发
脏读
脏读是指在一个事务处理过程里读取了另外一个未提交的事务中的数据。atom
不可重复读
不可重复读是指在对于数据库中的某条数据,一个事务范围内屡次查询返回不一样的数据值(这里的不一样是指某一条或多条数据的内容先后不一致,但数据条数相同)。3d
不可重复读和脏读的区别是:code
- 脏读是某一事务读取了另外一个事务未提交的脏数据。
- 不可重复读是读取了其余事务提交的数据。
幻读
幻读指的是一个事务在先后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。htm
事务隔离级别
- 读未提交(read uncommitted):一个事务还没提交时,它作的变动就能被别的事务看到。
- 读提交(read committed):一个事务提交以后,它作的变动才会被其余事务看到。
- 可重复读(repeatable read):一个事务执行过程当中看到的数据,老是跟这个事务在启动时看到的数据是一致的。固然在可重复读隔离级别下,未提交变动对其余事务也是不可见的。
- 串行化(serializable ):顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
下面用一个例子来讲明这四种隔离级别:blog
mysql> create table T(c int) engine=InnoDB;
mysql> insert into T(c) values(1);
假设表T只有一条记录,值是1。咱们来看看在不一样的隔离级别下,事务A会有哪些不一样的返回结果,也就是图里面T四、T六、T8的返回值分别是什么。
- 若隔离级别是“读未提交”, 则T4的值就是2。这时候事务B虽然尚未提交,可是结果已经被A看到了。所以,T六、T8也都是2。
- 若隔离级别是“读提交”,则T4是1,T6的值是2。事务B的更新在提交后才能被A看到。因此, T8的值也是2。
- 若隔离级别是“可重复读”,则T四、T6是1,T8是2。之因此T6仍是1,遵循的就是这个要求:事务在执行期间看到的数据先后必须是一致的。
- 若隔离级别是“串行化”,则在事务B执行“将1改为2”的时候,会被锁住。直到事务A提交后,事务B才能够继续执行。因此从A的角度看, T四、T6值是1,T8的值是2。
参数资料