并发控制

读写锁

  • 读锁: 共享锁
  • 写锁: 排它锁

颗粒度

  • 表锁,MySQL中开销最小的锁
  • 行锁,MySQL中开销最大的锁

事务

ACID特性

  • 原子性(Automatic)
  • 隔离性(Isolation)
  • 一致性(Consistency)
  • 持久性(durability)

隔离级别

    隔离的等级共有四级,不同的隔离等级可以处理不同的问题,同时越高等级的隔壁级别会导致并发性越来越低,性能消耗越严重。

下面解释一下什么是脏读,不可重复读,幻读。

Dirty Read (脏读)

可以看到,当我读取后,原来的事务可能回滚,那么读到的就是脏数据了。

non-repeatable(不可重复读)

为了解决dirty read ,那就等你提交完我再读取咯。可是可以看到 x1 ,x2 读到的是不同的,出现了不可重复读。

phantom read(幻读)

幻读是不可重复读的特殊情况。指同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录)。比如同一个事务A内第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记录,这就好像产生了幻觉。

资料阅读

可以阅读以下文章帮助理解隔离级别 :

总结隔离级别

  • read uncommited : 有可能会产生脏数据,很少使用.
  • read commited :  大多数数据库都是默认这种模式,但是 Mysql 不是, 又叫不可重复读(言外之意就是两次读的结果有可能不同),解决了脏数据问题,(当别人提交事务后对自己的事务有影响)
  • repeatable read :  MySQL 默认就是这种,就是每个操作都是独立的,不会影响,(对比上面一个模式就是即是实际值被修改了,两次读到却是一样的,都是原来的值).会出现幻行的情况,InnoDB使用间隙锁(next-key locking)策略防止幻读的出现.
  • seriaizable : 解决了并发问题,产生了性能问题.

死锁

事务一二都执行完第一条语句后,事务一发现自己需要的 stock= 4 的行纪录被事务二持有,而事务也一样,自己需要的 stock = 3 被事务1持有,就会产生死锁.InnoDB目前处理死锁的做法是,将持有最少行级排它锁的事务进行回滚(这是相对计较简单的死锁回滚算法).

事务日志

目的是提高工作效率.运行原理就是修改数据时只修改了内存拷贝,修改行为再纪录在事务日志中,而事务日志又是集中管理的,事务日志再一步步去更新磁盘数据.

MySQL 中的事务

MySQL提供了两种事务性的存储引擎: InnoDB 和 NDB Cluster

自动提交

MySQL默认采用自动提交(AutoCommit)模式,表示所有的操作都在一个事务中,只有Commit 提交或是Rollback 回滚,该事务才结束.

InnoDB采用的两阶段锁定协议,只有在执行Commit 或是Rollback 时才会释放.

在事务中混合使用存储引擎

如果在事务中使用了事务性和非事务性的表(例如InnoDB 和 MyISAMvia表).在正常提交的情况不会有什么问题,但是当该事务需要回滚的时候, 非事务的表会无法撤销修改.所以就会产生数据不一致的情况.

多版本并发控制(MVVC)

可以认为MVCC 是行级锁的一个变种,但是它在很多情况下避免了加锁操作.因此开销更低.

MVCC 的实现是通过保存数据在某个时间点的快照来实现的,InnoDB 是通过每行纪录后面保存的两个隐藏的列来实现的,这两个列纪录了行的创建时间,一个保存行的过期时间(或删除时间),(具体再去查文档了解)


存储引擎(简述)

InnoDB 存储引擎

  • 用来处理大量的短期事务
  • 基于聚簇索引建立的,聚簇索引对主键的检索很快
  • InnoDB的存储格式是平台独立的,即是说拷贝存储后可以在其他平台运行.
  • 内部做了很多优化,支持热备份.

MyISAM 存储引擎

在MySQL 5.1 以前 MyISAM (MSM) 是默认的存储引擎,包括很多特性 全文索引,压缩和空间函数,但MSM不支持行级锁和事务,缺点就是崩溃后无法正常恢复.对于只读的数据,或者表比较小,可以忍受修复操作,仍然可以使用MSM .

MSM 压缩表,如果表在创建并导入数据以后,不会在进行修改操作,那么这样的表或许适合MSM.压缩表不允许修改,可以极大地减少磁盘空间占用.也就可以减少磁盘IO.

MySQL (一)(未完成)的更多相关文章

  1. centos/windows服务器,Mysql数据库表结构损坏-已解决

    [问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,备份库表及数据重建 故障发现 周末公司断电,周一启动数据库就直接报错了 查看日志 上面标记的log,明确表示是非 ...

  2. MySQL基础整理(一)之SQL基础(未完成)

    大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...

  3. window平台下的MySQL快速安装。(不好意思,未完成待续,请飘过)

    MySQL安装方式 MSI安装(Windows Installer) ZIP安装 最好选择ZIP安装,比较干净,也快速搞好. 下载链接:http://pan.baidu.com/s/1sjFZZul ...

  4. 【未完成】mysql数据库安全性配置——用户授权

    方式一:从服务设置授权 一:用户授权——从服务设置授权 (1)准备测试环境——不同服务器用户 首先,查看数据库连接当前用户情况,当前连接的只有root用户. select user,host,pass ...

  5. MySQL常见面试题

    1. 主键 超键 候选键 外键 主 键: 数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超 键: 在关系中 ...

  6. 我的MYSQL学习心得(十七) 复制

    我的MYSQL学习心得(十七) 复制 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. [MySQL Reference Manual]15. 其他存储引擎

    15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...

  8. 20170103简单解析MySQL查询优化器工作原理

    转自博客http://www.cnblogs.com/hellohell/p/5718238.html 感谢楼主的贡献 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL ...

  9. 6_PHP AJAX MYSQL

    XAMPP套装软件: 包含Apache.MySQL.PHP等多个开源软件的集合. https://www.apachefriends.org/zh_cn/index.html 监听完整相应消息: Wi ...

随机推荐

  1. mysql主从报错截图

    1.首先确认报错的binlog和last event. 2.然后去主的机器上查看该报错的内容和报错的的位置,如果是结尾报错的,可以直接从新的binlog进行同步. #/mysql/logs# ../b ...

  2. robot framework-接口测试实例一

    需求:api/car/detail/recommendcar.json   接口返回的车辆数量少于等于20且车辆不能重复 分析:统计接口中返回的列表的长度,再把carid拿出来组成一个新的列表,判断这 ...

  3. 《Spark MLlib 机器学习实战》1——读后总结

    1 概念 2 安装 3 RDD RDD包含两种基本的类型:Transformation和Action.RDD的执行是延迟执行,只有Action算子才会触发任务的执行. 宽依赖和窄依赖用于切分任务,如果 ...

  4. django入门-测试-part5

    尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6515996.html 完全翻译自官方文档 https://docs.djangoproje ...

  5. Struts2、SpringMVC、Servlet(Jsp)性能对比 测试

    Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要 ...

  6. 最新版chrome浏览器如何离线安装crx插件?(转载)

    原文链接:https://newsn.net/say/chrome-crx-offline.html mac新版chrome开启离线插件安装 对于mac新版chrome,注意,大家一定要按照顺序来.m ...

  7. 'qt_sql_default_connection' is still in use

    出现这个告警是因为打开了多个db而没有及时关闭,网上搜了答案是使用完了执行 QSqlDatabase::removeDatabase(m_connectionName); 泄漏的问题有所改善,但点快了 ...

  8. dubbo服务暴露过程

    所谓服务暴露最终做的事情:绑定网络端口,开启serversokect服务以接收外部请求 服务暴露时序图 本地暴露 远程暴露 整体总结 dubbo服务提供者暴露服务的主过程:首先 ServiceConf ...

  9. Mac下JDK卸载方法

    注:要卸载 Java,必须具有管理员权限,并且必须以 root 用户身份或者使用 sudo 工具来执行删除命令. 按照下面所示,删除一个目录和一个文件(符号链接): 1.单击位于停靠栏中的 Finde ...

  10. JS框架设计之命名空间设计一种子模块

    命名空间 1.种子模块作为一个框架的最开始,除了负责初始化框架的最基础部分. 2.种子模块作为框架的最开始,那么什么是种子框架的最开始呢?答案是IIFE(立即调用函数表达式); IIFE(立即调用函数 ...