美文网首页
数据库隔离级别

数据库隔离级别

作者: lesline | 来源:发表于2018-02-09 13:31 被阅读50次

    数据库

    MyISAM与InnoDB的区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
    一般来说,MyISAM适合:
    (1)做很多count 的计算;
    (2)插入不频繁,查询非常频繁;
    (3)没有事务。
    InnoDB适合:
    (1)可靠性要求比较高,或者要求事务;
    (2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况

    隔离级别

    下表显示了不同隔离级别允许的并发副作用。
    隔离级别 | 脏读 | 非重复读取 | 幻像读
    未提交读 read uncommitted 是 是 是
    已提交读 read committed 是 是
    可重复读 repeatable read 是
    可序列化

    脏读(Dirty read)——含义和它的名字一样坏、允许读一个没有提交的,或“脏”的数据。这是 在打开其他用户正在写入的 OS 文件,并读取正好在那里的数据时所获得的结果。数据的完整性被损 害,外码被干扰,惟一的约束被忽略。
    特点:能接收到在任何时间在数据库中都不会存在的(mysql中会出现示提交的)答案
    非重复读取——这只不过意味着读者在时间 T1 读取一个行,并试图在时间 T2 再次读取那个行,
    该行可能已经更改。它可能已经消失,它可能已经被更新,等等。
    特点:一个事务中两次读的内空不一致
    幻像读(Phantom read)——这意味着,如果在时间 T1 执行了一个查询,并在时间 T2 再次执行, 附加的行可能已经添加到数据库中,它将影响结果。这与非重复读取不同,在这种情况下,已经读取 的数据没有改变,但有更多的数据满足查询标准。
    特点:一个事务中两次查询的条数不一致,会多。
    所谓幻读,就是同一个事务,连续做两次当前读 (例如:select * from t1 where id = 10 for update;),那么这两次当前读返回的是完全相同的记录 (记录数量一致,记录本身也一致),第二次的当前读,不会比第一次返回更多的记录 (幻象)

    实现方式:

    已提交读 read committed:
    当数据被更新时,将阻塞查询:此会话必须在该行等待, 直到持有独占锁定的事务提交;防止脏读
    可重复读 repeatable read(oracle无些隔离级别)
    当数据被查询时,将阻塞修改:一个共享读取锁定防止其他的会话修改已经读取的数据;会有死锁。防止非重复读
    READ COMMITTED:
    结果在语句开始的那一刻就固定
    SERIALIZABLE :
    事务结果在事务开始的那一刻就固定(本事务更新的结果本事务中再次查询可以看到,其它事务的修改本事务查询看不到)

    其中:Oracle实现 SERIALIZABLE 事务方式:原本通常在语句级得到的读一致性现在可以扩展到务事级。

    默认事务隔离级别

    SQL标准所定义的默认事务隔离级别是SERIALIZABLE

    MySQL

    MySQL的默认事务隔离级别是Repeatable Read
    由于应用next-key lock锁,避免了幻读。

    Oracle

    Oracle 的默认事务隔离级别是READ COMMITTED
    Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读。
    ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。
    read-only与serializable的区别:read-only不允许在本事务中进行DM操作。

    相关文章

      网友评论

          本文标题:数据库隔离级别

          本文链接:https://www.haomeiwen.com/subject/qnmftftx.html