数据库事务ACID特效

1、数据库事务正确执行的4个基础要素:

一、原子性
  整个事务中的全部操做,要么所有完成,要么所有不完成,不可能停滞在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样。
二、一致性
  在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
三、隔离性
  两个事务的执行是互不干扰的,一个事务不可能看到其余事务运行时,中间某一时刻的数据。
四、持久性
  在事务完成之后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

2、其余三个都比较好理解,重点说隔离性,隔离性为了解决的问题主要有三个:经过设置隔离级别的方式

一、 脏读(Drity Read):事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,若是事务A提交失败,事务B读到的就是脏数据。数据库

  同时也有脏读也是最低级别的隔离级别。安全

      

       为了克服脏读,SQL标注提出了第二个隔离级别:读/写提交:就是说一个事务只能读取另外一个事务已经提交的事务并发

  

  可是也会引起其余问题性能

  

  由于事务一不能读取事务二未提交的事务,因此不知道余额的变化过程,只能知道余额最后变化的值,即余额是一个变化的值。咱们称之为不可重复读。  spa

 二、不可重复读(Non-repeatable read) : 在同一个事务中,对于同一份数据读取到的结果不一致。好比,事务B在事务A提交前读到的结果,和提交后读到的结果可能不一样。不可重复读出现的缘由就是事务并发修改记录,要避免这种状况,最简单的方法就是对要修改的记录加锁,这致使锁竞争加重,影响性能。线程

  为了克服不可重读带来的错误,SQL标准又提出了一个隔离级别:可重复读:针对数据库的同一条记录的读/写按照一个序列化操做,不会产生交叉状况,保证数据一致性。blog

  能够认为是锁住这个记录。事务

  可是也会产生一些问题it

  

 三、幻读(Phantom Read) : 在同一个事务中,同一个查询屡次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交先后各执行了一次查询操做,发现后一次比前一次多了一条记录。幻读仅指因为并发事务增长记录致使的问题,这个不能像不可重复读经过记录加锁解决,由于对于新增的记录根本没法加锁。须要将事务串行化,才能避免幻读。table

    为了克服幻读,SQL推出更高的隔离级别----序列化

3、总结

 

4、怎么选择隔离级别

  一、随着隔离级别的提升,系统性能逐渐降低(“高风险,高回报”)。

  二、序列化会严重抑制并发,从而引起大量的线程挂起,知道获取锁才能进行下一步操做,恢复时又须要等待大量的时间,可是数据绝对安全。

    能够在并发量不大但又保证数据安全性的情境下使用。

  三、企业通常选择读/写提交模式。

  四、MySql支持4中隔离级别,默认为可重复读,Oracle支持读/写提交和可重复读,默认为读/写提交。

  五、总之:隔离级别须要根据并发量的大小和性能来决定。

      

相关文章
相关标签/搜索