zoukankan      html  css  js  c++  java
  • 事务特性及隔离问题

    今天是学习计划的第三天,今天打算继续昨天探讨的事务问题。
    所以,今天的学习内容是事务特性及隔离问题。
    那事务都具有哪些特性呢?

    • 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    • 一致性:事务前后数据的完整性必须保持一致。
    • 隔离性:事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
    • 持久性:持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

    多个线程开启各自事务操作数据库中的数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。如果不考虑隔离,可能会引发如下问题。

    1. 脏读
      指一个事务读取了另外一个事务未提交的数据。
      这是非常危险的。举个例子:假设A向B转账100元,对应的sql语句如下
    update account set money = money - 100 where name = 'a';
    update account set money = money + 100 where name = 'b';
    

    当第一条sql语句执行完,第二条还没执行(A未提交时),如果此时B查询自己的账户,就会发现自己多了100元钱,如果A等B走后再回滚,B就会以为转账成功了,但是钱又返还给了A,从而导致B损失100元
    脏读被认为是数据库中的最重要问题,是不被任何数据库所允许的。

    1. 不可重复读
      在一个事务内读取表中的某一行数据,多次读取结果不同。
      举个例子:例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。
      和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
      很多人认为这种情况就对了,无须困惑,当然是后面的为准。我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。
      不可重复读在有些数据库被认为是没有问题的,所以它在某些数据库中允许出现。
    2. 虚度(幻读)
      是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
      举个例子:假如丙存款100元未提交,这时银行做报表统计account表中所有用户的总额为500元,然后丙提交了,这时银行再统计发现帐户为600元了,造成虚读同样会使银行不知所措,到底以哪个为准。
      会发现,虚读和不可重复读是十分相似的,以致于很多人很难分辨它们,你只需要知道,它们最大的区别是:不可重复读读取到的是更新(update)数据,而虚读读取到的是插入(insert)数据。
      同样,虚读在有些数据库也被认为不是问题,允许该现象出现。

    说完了引发的问题后,我们引出今天的主角,事务隔离级别。
    数据库共定义了四种隔离级别:

    • Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
    • Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
    • Read committed:可避免脏读情况发生(读已提交)
    • Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
      隔离级别由高到低排列:Serializable>Repeatable read>Read committed>Read uncommitted
      数据库隔离问题危害级别由高到低:脏读>不可重复读>虚读

    在Oracle数据库中,默认隔离级别是Read committed
    在MySQL数据库中,默认隔离级别是Repeatable read
    由此可以发现,基本所有的数据库都不会把隔离级别设置成最高,也不会设置成最低。
    因为安全级别越高,处理效率就越低,但是安全级别越低,危害就越大。

    在数据库中,可以通过
    set transaction isolation level 设置事务隔离级别
    select @@tx_isolation 查询当前事务隔离级别
    两条语句控制事务隔离级别。

  • 相关阅读:
    EBS SQL > Form & Report
    oracle sql 优化分析点
    MRP 物料需求计划
    MRPII 制造资源计划
    Barcode128 应用实务
    Oracle SQL语句优化技术分析
    APPSQLAP10710 Online accounting could not be created. AP Invoice 无法创建会计分录
    Oracle数据完整性和锁机制
    ORACLE Responsibility Menu Reference to Other User
    EBS 常用 SQL
  • 原文地址:https://www.cnblogs.com/blizzawang/p/11411313.html
Copyright © 2011-2022 走看看