zoukankan      html  css  js  c++  java
  • mysql锁及四种事务隔离级别笔记

    前言
    • 数据库是一个共享资源,为了充分利用数据库资源,发挥数据
      库共享资源的特点,应该允许多个用户并行地存取数据库。但这样就会产生多个用户程序并
      发存取同一数据的情况,为了避免破坏一致性,所以必须提供并发控制机制。

    • 并发控制是以事务(transaction)为单位进行的。

    什么时候表锁什么时候行锁?
    • 行锁是指的innodb引擎,只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁。
    查看表锁
    #查看是否有锁表的情况
    show OPEN TABLES where In_use > 0;
    
    #拼接hyq用户的kill语句,谨慎执行。
    select  concat('KILL ',id,';') from
    information_schema.processlist where user='hyq';
    
    #查看当前的事务
    SELECT * FROM information_schema.innodb_trx;
    #查看当前锁定的事务
    SELECT * FROM information_schema.innodb_locks;
    #查看当前等锁的事务
    SELECT * FROM information_schema.innodb_lock_waits;
    
    查看行锁
    SHOW STATUS LIKE 'innodb_row_lock%';
    
    四种事务隔离级别
    • 一个事务对某个数据对象加锁后究竞拥有什么样控制是由封锁类型决定的,基本的锁有两种,排它锁(写锁、X锁),共享锁(读锁、S锁)。两者的相容关系如下:

    file

    例子:

    file

    未提交读(Read uncommitted)
    • 未提交读是数据库事务隔离级别中最低的一种,在这种级别下,一个事务会读到另一个事务更新后但未提交的数据,如果事务1 rollback后,那么事务2读取的数据就是脏数据,简称脏读。
      file
    已提交读(Read Committed)
    • 只能读取到已经提交的数据。在事务1内,多次读同一数据,在这个事务还没有结束时,如果事务2恰好修改了这个数据,那么,在事务1中,两次读取的数据就可能不一致。也就是说的不可重复读的问题。如下:

    file

    可重复读(Repeated Read)
    • 可重复读就是多次读取的结果都一直,而不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。在这种情况下可能会遇到幻读的问题如下:

    file

    可串行化(Serializable )
    • 可串行性是并行调度正确性的唯一准则,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
      为保证并行调度可串行性而提供的封锁协议。因此我们可以得出如下结论:这个事务级别的,其并行执行的结果一定是正确的,但是呢,由于串行执行,大大降低了并行度,所以一般不使用它。
      file

    欢迎来公众号【侠梦的开发笔记】 一起交流进步

  • 相关阅读:
    poj 1007:DNA Sorting(水题,字符串逆序数排序)
    蓝桥杯北京之旅【第二篇·2014.5.31】
    poj 1006:Biorhythms(水题,经典题,中国剩余定理)
    蓝桥杯北京之旅【第一篇·2014.5.30】
    【2014年6月份日常记录表(2014.6.1—6.30,30天)】
    poj 1002:487-3279(水题,提高题 / hash)
    ThreadPoolExecutor机制探索-我们到底能走多远系列(41)
    ibatis批量操作补充
    Maven管理 划分模块
    顺序队列实现任务以此执行-任务调度系列2
  • 原文地址:https://www.cnblogs.com/hyq0823/p/12130276.html
Copyright © 2011-2022 走看看