关于事务、事务的隔离级别以及对脏读、不可重复读、幻读的理解

什么是事务?

  事务,即数据库事务。是数据库管理系统执行过程当中的一个逻辑单位,由一个有限的数据库操做序列构成数据库

  一般,事务的正确执行会使数据库从一种状态转换为另外一种状态并发

事务的特性(ACID原则)

  •  原子性(atomicity)       即不可分割性,事务要么全执行、要么全不执行。
  •  一致性(consistency)   事务的执行使得数据库从一种正确状态转换成另一种正确状态。
  •  隔离性(isolation)        在事务正确提交以前,不容许把事务对该数据的改变提供给任何其余事务。
  •  持久性(durability)       事务正确提交以后,其结果将永远保存在数据库之中。

 

并发状态下事务会产生的问题

  并发状态解释为当事务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 而言就像是产生了幻觉。

 

事务的隔离级别

  为了应对上面并发状况下出现的问题,事务的隔离级别就产生了。当事务的隔离级别越高的时候,上面的问题就会越少,可是性能消耗也会越大。因此在实际生产过程当中,要根据需求去肯定隔离级别。

四种隔离级别

READ_UNCOMMITTED

  读未提交,即可以读取到没有被提交的数据,因此很明显这个级别的隔离机制没法解决脏读、不可重复读、幻读中的任何一种。

READ_COMMITED

  已提交,即可以读到那些已经提交的数据,可以防止脏读,可是没法解决不可重复读和幻读的问题。

REPEATABLE_READ

  重复读取,即在数据读出来以后加锁,相似"select * from XXX for update",明确数据读取出来就是为了更新用的,因此要加一把锁,防止别人修改它。REPEATABLE_READ的意思也相似,读取了一条数据,这个事务不结束,别的事务就不能够改这条记录,这样就解决了脏读、不可重复读的问题,可是幻读的问题仍是没法解决。

SERLALIZABLE

  串行化,最高的事务隔离级别,无论多少事务,挨个运行完一个事务的全部子事务以后才能够执行另一个事务里面的全部子事务,这样就解决了脏读、不可重复读和幻读的问题了。

相关文章
相关标签/搜索