存储引擎

要了解mysql的锁,就要先从存储引擎说起。

常用存储引擎列表如下图所示:

最常使用的两种存储引擎:

  • Myisam是Mysql的默认存储引擎。当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。
  • InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

PS:可以在create table语句括号之后结束之前通过如下方式指定存储引擎:

ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='这个表使用的是MyISAM'存储引擎。

各个引擎的适用环境:

  1. MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一
  2. InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。
  3. Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
  4. Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

mysql相关指令:

查看mysql支持的所有存储引擎:
> show engines;
查看当前mysql所使用的存储引擎:
> show variables like '%storage_engine%';
查看表使用的存储引擎
a、show table status from db_name where name='table_name';
b、show create table table_name;

关闭Innodb引擎方法:
1、关闭mysql服务: net stop mysql
2、 找到mysql安装目录下的my.ini文件:
将default-storage-engine=INNODB改为default-storage-engine=MYISAM
将#skip-innodb的注释去掉,改为skip-innodb
3、启动mysql服务:net start mysql

cmd下远程连接其他的mysql:

-u root -h 10.16.70.160 -p

Mysql的默认调度和锁定策略:
写入操作优先于读取操作。对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。对某张数据表的多个读取操作可以同时地进行。
对某张数据表的多个读取操作可以同时地进行。

共享锁和排他锁:

共享锁:

用法: select * lock in share mode;
锁申请的前提:
当申请的记录没有被排他锁锁定的时候才可以进行申请。
操作限制:

线程    读取操作    写入操作                  共享锁申请          排他锁申请
使用共享锁的线程     可读   可写/不可写(报错)  可申请   可申请
不使用共享锁的线程    可读    不可写(阻塞)   可申请   不可申请(阻塞)

PS:

1. 此时使用共享锁和不使用共享锁的线程读取到的数据是同一个版本。
2. 对于写入操作,使用共享锁的线程需要分情况讨论,当只有当前线程对指定记录使用共享锁时,线程是可对该记录进行写入操作(包括更新与删除),这是由于在写入操作前,线程向该记录申请了排他锁,然后才进行写入。当其他线程也对该记录使用共享锁时,则不可进行写入操作,系统会有报错提示。不对锁定记录使用共享锁的线程,当然是不可进行写入操作了,写入操作会阻塞。
3. 直接在mysql中输入select * lock in share mode;会发现另一个连接仍然可以修改数据,这是应为mysql设置的默认autocommit标志为1,其实执行完这一句之后锁就释放了。
应该通过事务来进行处理,即 begin 、 commit . 这一点对于排他锁也适用。

排他锁:
用法: SELECT ... FOR UPDATE;
锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

线程    读取操作    写入操作                  共享锁申请          排他锁申请
使用排他锁的线程    可读(新版本)   可写  可申请   可申请
不使用排他锁的线程   可读(旧版本)   不可写(阻塞)   不可申请(阻塞)   不可申请(阻塞)

在事务的操作中任何对记录的更新和删除操作会自动加上排他锁

Mysql官方文档对于共享锁和排他锁的说明:
SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows .A shared mode lock enables other sessions to read the rows but not to modify them.
The rows read are the latest available, so if they belong to another transaction that has not yet the read blocks until that transaction ends.

SELECT ... FOR UPDATE sets an exclusive lock on the rows .An exclusive lock prevents other sessions from accessing the rows for reading or writing.

(注意快照读是可以的但是不允许申请共享锁读)

PS: 对于排他锁和共享锁如果不是按照主键作为where条件,最终加锁的还是整个表而不是单条记录

Mysql锁之行锁:

行锁是Mysql中力度最小的锁。MyIsam引擎只支持表级锁,innodb支持行级锁。行级锁拥有最大的并发支持特性但是实现成本也比较高,也比较容易造成死锁。
Innodb的行级锁分为共享锁和排他锁。共享锁允许事务读一行记录但是不允许任何线程对该记录进行修改。排他锁允许事务更新或者删除一行记录,其他线程不许操作该记录。

当然前提是必须适用主键作为查询条件。

以上只是mysql锁的初步入门,更多锁的知识,还得继续深入!

Mysql锁初步的更多相关文章

  1. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  2. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  3. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  4. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  5. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  6. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

  7. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  8. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  9. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

随机推荐

  1. http协议客户端向服务器端请求时一般需要发送的内容

    out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...

  2. 二项堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二项堆,它和之前所讲的堆(二叉堆.左倾堆.斜堆)一样,也是用于实现优先队列的.和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  3. Solr搜索服务架构图

    来源:http://www.open-open.com/lib/view/open1400576900081.html

  4. 如何使用DDMS Heap查看Android应用内存情况

    作为大四毕业生,而且还是二本,加上技术基础不咋样,找工作自然也是辛酸得很...最糟糕的情况就是一开始实在是太小看了求职之路的艰辛,整个9月都是无所事事的度过,直到月底面试腾讯被鄙视后才顿然醒悟,意识到 ...

  5. php的SAPI,CLI SAPI,CGI SAPI

    首先一个问题:在命令行下执行:php -r 'echo 12;' 控制台会打印出 12: 这个过程不是很奇妙么,我输入的是shell命令,但是执行的却是php脚本.php脚本执行完成之后的输出还能在控 ...

  6. Velocity魔法堂系列一:入门示例

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  7. [Tool] WireShark基本使用

    Wireshark(前称Ethereal)是一个网络封包分析软件. 在windows平台上,Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. [参数设置]: 抓包参数(Cap ...

  8. Maven提高篇系列之(一)——多模块 vs 继承

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  9. C#写文本日志帮助类(支持多线程)

    代码: using System; using System.Configuration; using System.IO; using System.Threading.Tasks; namespa ...

  10. 适用于jquery1.11.1的ajaxfileupload.js

    ajaxfileupload源码 解决上传成功不走success的问题 解决高版本jquery兼容性问题 jQuery.extend({ createUploadIframe: function(id ...