zoukankan      html  css  js  c++  java
  • MySQL (一)(未完成)

    并发控制

    读写锁

    • 读锁: 共享锁
    • 写锁: 排它锁

    颗粒度

    • 表锁,MySQL中开销最小的锁
    • 行锁,MySQL中开销最大的锁

    事务

           ACID特性

    • 原子性(Automatic)
    • 隔离性(Isolation)
    • 一致性(Consistency)
    • 持久性(durability)

    隔离级别

          隔离的等级共有四级,不同的隔离等级可以处理不同的问题,同时越高等级的隔壁级别会导致并发性越来越低,性能消耗越严重。
      isolation

              下面解释一下什么是脏读,不可重复读,幻读。

       

      Dirty Read (脏读)

               可以看到,当我读取后,原来的事务可能回滚,那么读到的就是脏数据了。dirty read

       

      non-repeatable(不可重复读)

                为了解决dirty read ,那就等你提交完我再读取咯。可是可以看到 x1 ,x2 读到的是不同的,出现了不可重复读。

      unrepeatedread

       

      phantom read(幻读)

               幻读是不可重复读的特殊情况。指同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录)。比如同一个事务A内第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记录,这就好像产生了幻觉。

       

      资料阅读

               可以阅读以下文章帮助理解隔离级别 :

             

      总结隔离级别

      • read uncommited : 有可能会产生脏数据,很少使用.
      • read commited :  大多数数据库都是默认这种模式,但是 Mysql 不是, 又叫不可重复读(言外之意就是两次读的结果有可能不同),解决了脏数据问题,(当别人提交事务后对自己的事务有影响)
      • repeatable read :  MySQL 默认就是这种,就是每个操作都是独立的,不会影响,(对比上面一个模式就是即是实际值被修改了,两次读到却是一样的,都是原来的值).会出现幻行的情况,InnoDB使用间隙锁(next-key locking)策略防止幻读的出现.
      • seriaizable : 解决了并发问题,产生了性能问题.

          

      死锁

            事务一二都执行完第一条语句后,事务一发现自己需要的 stock= 4 的行纪录被事务二持有,而事务也一样,自己需要的 stock = 3 被事务1持有,就会产生死锁.InnoDB目前处理死锁的做法是,将持有最少行级排它锁的事务进行回滚(这是相对计较简单的死锁回滚算法).死锁

      事务日志

             目的是提高工作效率.运行原理就是修改数据时只修改了内存拷贝,修改行为再纪录在事务日志中,而事务日志又是集中管理的,事务日志再一步步去更新磁盘数据.

      事务日志

      MySQL 中的事务

            MySQL提供了两种事务性的存储引擎: InnoDB 和 NDB Cluster

      自动提交

            MySQL默认采用自动提交(AutoCommit)模式,表示所有的操作都在一个事务中,只有Commit 提交或是Rollback 回滚,该事务才结束.

            InnoDB采用的两阶段锁定协议,只有在执行Commit 或是Rollback 时才会释放.

      在事务中混合使用存储引擎

             如果在事务中使用了事务性和非事务性的表(例如InnoDB 和 MyISAMvia表).在正常提交的情况不会有什么问题,但是当该事务需要回滚的时候, 非事务的表会无法撤销修改.所以就会产生数据不一致的情况.

      多版本并发控制(MVVC)

             可以认为MVCC 是行级锁的一个变种,但是它在很多情况下避免了加锁操作.因此开销更低.

             MVCC 的实现是通过保存数据在某个时间点的快照来实现的,InnoDB 是通过每行纪录后面保存的两个隐藏的列来实现的,这两个列纪录了行的创建时间,一个保存行的过期时间(或删除时间),(具体再去查文档了解)


      存储引擎(简述)

      InnoDB 存储引擎

      • 用来处理大量的短期事务
      • 基于聚簇索引建立的,聚簇索引对主键的检索很快
      • InnoDB的存储格式是平台独立的,即是说拷贝存储后可以在其他平台运行.
      • 内部做了很多优化,支持热备份.

      MyISAM 存储引擎

            在MySQL 5.1 以前 MyISAM (MSM) 是默认的存储引擎,包括很多特性 全文索引,压缩和空间函数,但MSM不支持行级锁和事务,缺点就是崩溃后无法正常恢复.对于只读的数据,或者表比较小,可以忍受修复操作,仍然可以使用MSM .

            MSM 压缩表,如果表在创建并导入数据以后,不会在进行修改操作,那么这样的表或许适合MSM.压缩表不允许修改,可以极大地减少磁盘空间占用.也就可以减少磁盘IO.

    • 相关阅读:
      58. 最后一个单词的长度
      53. 最大子序和
      50. Pow(x, n)
      35. 搜索插入位置
      28. 实现 strStr()
      leetcode 27. 移除元素
      leetcode 26. 删除排序数组中的重复项
      leetcode 21. 合并两个有序链表
      20. 有效的括号
      多线程案例_循环打印_设计4个线程...
    • 原文地址:https://www.cnblogs.com/Benjious/p/10435281.html
    Copyright © 2011-2022 走看看