MySql

88 阅读2分钟

MySql锁的基本介绍

  • 锁是计算机协调多个进程或线程并发访问某个资源的机制
  • 不同存储引擎支持不同的锁机制
  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最大,并发度最低。适合于以查询为主
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用 MylSAM表锁
  • MySQL的表级锁有两种模式:表共享读锁和表独占写锁
  • 写阻塞读、写
  • 读阻塞写
  • 读和写是串行的,可以通过变量concurrent_insert控制,允许一个进程读表的同时,另一个进程从表尾插入记录 InnoDB锁
  • 事务及其ACID属性
    • 原子性:事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行
    • 一致性:在事务开始和完成时,数据都必须保持一致状态
    • 隔离性:数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。
    • 持久性:事务完成之后,它对数据的修改时永久性的,即使出现系统故障也能够保持
  • 并发事务带来的问题
    • 并发事务处理能大大增大数据库资源利用率,提高事务吞吐量,从而支持更多用户的并发操作,与此同时,会带来以下问题:
    • 脏读
    • 不可重复读
    • 幻读
    • 上诉问题都是数据库读一致性的问题,可以通过事务的隔离机制进行保证
      • read uncommitted
      • read committed
      • repeatable read(默认的隔离级别)
      • serializable
  • InnoDB的行锁模式及加锁方式
    • 共享锁
    • 排他锁
  • InnoDB行锁实现方式
    • InnoDB行锁时通过给索引上的索引项加锁来实现的,这意味这:只有通过索引条件查询时,innoDB才使用行级锁,否则将使用表锁
    • 行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引建,是会出现冲突的