事务,即数据库事务。是数据库管理系统执行过程当中的一个逻辑单位,由一个有限的数据库操做序列构成。数据库
一般,事务的正确执行会使数据库从一种状态转换为另外一种状态。并发
并发状态解释为当事务A和事务B对同一资源进行操做时,可能会遇到不少的问题。性能
即事务A读到了事务B尚未提交的数据。若是事务A对数据进行了更新,可是事务A并无提交,可是事务B这个时候看到了事务A没有提交的更新。当事务A进行了回滚,那么刚刚事务B看到的数据就是脏数据。也就是脏读。atom
例子:事务
A 给 B 转了100万,可是 A 尚未提交,此时 B 查询本身帐户,多了100万。而后 A 发现转错人了,回滚了事物。而后 B 100万就没了。在这个过程当中 B 查到了没有提交的数据(多出的100万),这就是脏读。ci
即同一事务在事务执行过程当中对同一个数据进行了屡次读取,可是每一次读取的数据结果都不相同。缘由是在两次读取间隔,数据别其余人修改了,致使了统一事务两次读取结果不一致。资源
例子:it
A 查询银行余额为100万,B 这个时候取走了50万,此时余额变成了50万,A 再一次查询余额,变成了50万。对 A 而言两次结果不一致就是不可重复读。io
即在事务 A 屡次读取数据集的过程当中中,事务 B 对数据进行了新增操做或者删除操做,致使事务 A 屡次读取的数据集不一致。date
例子:
A 修改当前公司全部职员信息的时候,B 向其中插入了一个新的职员,这个时候 A 提交的时候发现了一个本身没有修改过的职员的信息,对 A 而言就像是产生了幻觉。
为了应对上面并发状况下出现的问题,事务的隔离级别就产生了。当事务的隔离级别越高的时候,上面的问题就会越少,可是性能消耗也会越大。因此在实际生产过程当中,要根据需求去肯定隔离级别。
读未提交,即可以读取到没有被提交的数据,因此很明显这个级别的隔离机制没法解决脏读、不可重复读、幻读中的任何一种。
已提交,即可以读到那些已经提交的数据,可以防止脏读,可是没法解决不可重复读和幻读的问题。
重复读取,即在数据读出来以后加锁,相似"select * from XXX for update",明确数据读取出来就是为了更新用的,因此要加一把锁,防止别人修改它。REPEATABLE_READ的意思也相似,读取了一条数据,这个事务不结束,别的事务就不能够改这条记录,这样就解决了脏读、不可重复读的问题,可是幻读的问题仍是没法解决。
串行化,最高的事务隔离级别,无论多少事务,挨个运行完一个事务的全部子事务以后才能够执行另一个事务里面的全部子事务,这样就解决了脏读、不可重复读和幻读的问题了。