zoukankan      html  css  js  c++  java
  • MySQL锁机制

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

    锁的分类:

    1.从对数据的操作类型来分:

    --读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

    --写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁

    2.从对数据的操作粒度来分:行锁、表锁

    MySQL锁概述
    相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
    MySQL这3种锁的特性可大致归纳如下。
    开销、加锁速度、死锁、粒度、并发性能
    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
    从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。这一点在本书的“开发篇”介绍表类型的选择时,也曾提到过。下面几节我们重点介绍MySQL表锁和 InnoDB行锁的问题,由于BDB已经被InnoDB取代,即将成为历史,在此就不做进一步的讨论了。
    MyISAM表锁
    MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎(实际 InnoDB是单独的一个公司,现在已经被Oracle公司收购)。但是MyISAM的表锁依然是使用最为广泛的锁类型。本节将详细介绍MyISAM表锁的使用。

    查询表级锁争用情况

    可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
    mysql> show status like 'table%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Table_locks_immediate | 2979  |
    | Table_locks_waited    | 0     |
    +-----------------------+-------+
    2 rows in set (0.00 sec))

    MySQL表级锁的锁模式

    MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。锁模式的兼容性如表20-1所示。

    表20-1                                            MySQL中的表锁兼容性                
    请求锁模式
             是否兼容
    当前锁模式
    None 读锁 写锁
    读锁
    写锁

    可见,对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如表20-2所示的例子可以知道,当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。
    表20-2                          MyISAM存储引擎的写阻塞读例子
    session_1 session_2
    获得表film_text的WRITE锁定
    mysql> lock table film_text write;
    Query OK, 0 rows affected (0.00 sec)
     
    当前session对锁定表的查询、更新、插入操作都可以执行:
    mysql> select film_id,title from film_text where film_id = 1001;
    +---------+-------------+
    | film_id | title       |
    +---------+-------------+
    | 1001    | Update Test |
    +---------+-------------+
    1 row in set (0.00 sec)
    mysql> insert into film_text (film_id,title) values(1003,'Test');
    Query OK, 1 row affected (0.00 sec)
    mysql> update film_text set title = 'Test' where film_id = 1001;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    其他session对锁定表的查询被阻塞,需要等待锁被释放:
    mysql> select film_id,title from film_text where film_id = 1001;

    等待

    释放锁:
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)
    等待
     
    Session2获得锁,查询返回:
    mysql> select film_id,title from film_text where film_id = 1001;
    +---------+-------+
    | film_id | title |
    +---------+-------+
    | 1001    | Test  |
    +---------+-------+
    1 row in set (57.59 sec)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    IDEA导入项目后,导入artifacts 方法 以及 Spring的配置文件找不到的解决方法
    Tomcat8中如何内存溢出,如何增大内存?
    SpringSecurity-权限关联与控制
    学习黑马教学视频SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied
    SSM项目中,关于Test类中不能使用Autowired注入bean的问题
    spring mvc绑定参数之 类型转换 有三种方式:
    maven缺失ojdbc6解决方案 :Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
    学习SpringMVC 文件上传 遇到的问题,403:returned a response status of 403 Forbidden ,409文件夹未找到
    【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
    Protocol buffers--python 实践 简介以及安装与使用
  • 原文地址:https://www.cnblogs.com/winner-0715/p/6583213.html
Copyright © 2011-2022 走看看