zoukankan      html  css  js  c++  java
  • 数据库事务ACID特效

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

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

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

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

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

          

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

      

      但是也会引发其他问题

      

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

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

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

      可以认为是锁住这个记录。

      但是也会产生一些问题

      

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

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

    三、总结

     

    四、怎么选择隔离级别

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

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

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

      3、企业一般选择读/写提交模式。

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

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

          

  • 相关阅读:
    系统进程
    Javascript中的常用事件
    进程信息库网址
    C#中使用临时存储过程
    Transactsql 中的 rollup 和cube的使用
    如何使用fckeditor在线编辑器(asp)
    微软将 jQuery IntelliSense整合到Visual Studio
    no such file to load openssl Anny
    Ubuntu 防火墙 ufw Anny
    Install Apache 2 from Source on Linux(转) Anny
  • 原文地址:https://www.cnblogs.com/dongtian-blogs/p/10819347.html
Copyright © 2011-2022 走看看