zoukankan      html  css  js  c++  java
  • 数据库锁

    一、引言                                                                                                                  

    我们都知道,在单体应用系统中,数据库的事务具有ACID特性,其中一条保持了数据的一致性。我们来看下数据库的事务和锁。

    DBMS事务通常是对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:

    • 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
    • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 
      在并发访问情况下,可能会出现脏读、不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念。

    二、锁                                                                                                                      

    当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。

    锁就是其中的一种机制。

    锁划分: 

    • 按操作划分:可分为DML锁、DDL锁 
    • 按锁的粒度划分:可分为表级锁、行级锁、页级锁 
    • 按锁级别划分:可分为共享锁、排他锁 
    • 按加锁方式划分:可分为自动锁、显示锁 
    • 按使用方式划分:可分为乐观锁、悲观锁 

    DML锁(Data Manipulation Lock),用于保护数据的完整性,其中包括行级锁(Row Locks (TX锁))、表级锁(table lock(TM锁))。 

    DDL锁(Data Definition Lock),用于保护数据库对象的结构, 如表、索引等的结构定义, 其中包括排他DDL锁(Exclusive DDL lock)、共享DDL锁(Share DDL lock)、可中断解析锁(Breakable parse Lock)。

    注意点

    分析锁的运作时,要记住mysql有一个autocommit参数,默认是on,它的作用使每一条单独的查询都是一个事务,并且自动开始,自动提交(执行完以后就自动结束了,如果你要适用select for update,而不手动调用 start transaction,这个for update的行锁机制等于没用,因为行锁在自动提交后就释放了),所以事务隔离级别和锁机制即使你不显式调用start transaction,这种机制在单独的一条查询语句中也是适用的。

    1、行级锁

    表示只针对当前操作的行进行加锁。行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。 

    优势:锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 

    劣势:开销大,加锁慢,会出现死锁;

    2、表级锁

    表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。表级锁是MySQL中锁定粒度最大的一种锁,最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。 

    优势:开销小,加锁快;不会出现死锁; 

    劣势:锁定粒度大,发出锁冲突的概率最高,并发度最低。

    3、页级锁

    其是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。 

    优势:开销和加锁时间界于表锁和行锁之间; 

    劣势:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

  • 相关阅读:
    Elasticsearch 结构化搜索
    KMP 算法
    ElasticSearch 配置
    C++ 入门
    Spark 基础操作
    HBase 与 MapReduce 集成
    iOS面试相关
    iOS开发值得学习的Demo
    Mac系统安装MyEclipse
    linux安装tomcat
  • 原文地址:https://www.cnblogs.com/exceptioneye/p/5373465.html
Copyright © 2011-2022 走看看