zoukankan      html  css  js  c++  java
  • 数据库的四种隔离级别

    数据库的事务:一个逻辑工作单元,在工作单元的一系列操作要么全部执行,要么全部不执行。

    四个特性:ACID,原子性(定义),一致性(事务开始前,事务结束后,数据库的完整性没有被破坏),隔离性(四个级别),持久性(事务完成后,对表的修改是永久的)。

    问题来了:

     A、数据库的完整性:数据库数据在逻辑上的一致性,正确性,有效性和相容性。完整性约束:1.实体完整性,每一行是表里唯一的实体;2.域完整性,表中的列必须满足数据类型约束(取值范围,数据类型);3.参照完整性,两个表的主关键字和外关键字一致,防止数据丢失或者无意义的数据在数据库扩散;4.用户定义的完整性。

    四个隔离级别:

    1.Read uncommited。一个事务可以读取另外一个未提交事务的数据。读取到事务未提交但已经改变的数据,而后事务回滚,数据未改变,为脏读。

    2.Read commited,一个事务要等到另一个事务提交后才能读数据。在这一级别下,读锁在select完成后就释放,写锁在事务提交后才释放。所以一个事务先读数据,而后由另外一个事务update了表,等该事务结束后,第一个事务再次读表的时候数据发生了变化,为不可重复读。

    3.Repeatable read,在读事务未提交时,不允许修改操作。不可重复度对应的是修改(update)操作,如果是insert操作,记录条数不一致的情况可能会发生,为幻读。

    4.Serializable,事务串行化顺序执行。避免脏读,不可重复度,幻读,但是导致数据库性能低。

    这个时候,会不会对数据库实现隔离级别的原理产生了兴趣?

    先来介绍一下数据库的锁:

    1.共享锁(S锁):又称读锁,对数据对象加上S锁后,其他事务只能再对数据对象加S锁,而不能加X锁。

    2.排它锁(X锁):又称写锁,对数据对象加上X锁后,其他事务无法加锁,直到X锁被释放。

    锁的规则:

    高并发出现的问题:丢失修改,脏读,不可重复度,幻读。

    1.一级封锁协议:事务T修改数据R之前(并不是事务开始)必须先对其加X锁,事务结束(commit+rollback)后释放。会发生脏读,不可重复度,幻读。

    2.二级封锁协议:一级封锁协议+事务在读取数据之前必须先加S锁,读完后释放S锁。会发生不可重复度,幻读。

    3.三级封锁协议:一级封锁协议+数据在读取数据之前必须先加S锁,事务结束后释放S锁。会发生幻读

    Read uncommited级别是由一级封锁协议实现的。

    Read commited级别是由二级封锁协议。

    Repeatable read级别是三级封锁协议实现的(Innodb默认)。

    好吧,我承认,这不能叫原理。

    。。。我还会回来的。

  • 相关阅读:
    实验二 结对编程 阶段二
    实验一 git代码版本管理
    hadoop启动后,9000端口无法连接,netstat -tpnl中找不到该端口
    HDFS ha 格式化报错:a shared edits dir must not be specified if HA is not enabled.
    为什么zookeeper的节点配置的个数必须是奇数个
    使用root配置的hadoop并启动会出现报错
    安装OpenCV 3 on Raspbian Jessie
    基于树莓派的专用摄像头实时监控
    第九章 构造数据类型实验
    第八章 指针实验
  • 原文地址:https://www.cnblogs.com/rookie111/p/8678627.html
Copyright © 2011-2022 走看看