很多程序员都学过MySQL,而且也会写SQL语句。但仅仅会写还远远不够,在面试中以及在工作中,还必须要会事务和并发。

一、事务

事务是满足 ACID 特性的操作,可以通过 Commit 提交事务,也可以使用 Rollback 进行回滚。
A(Atomicity)原子性:事务被视为不可分割的小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
C(Consistency)一致性:数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
I(Isolation)隔离性:事务之间的操作是相互隔离的。
D(Durability)持久性:一旦事务提交,则其所做的修改将会永远保存到数据库中。

二、并发一致性

在并发环境下,容易造成并发一致性问题,导致隔离性被破坏。假设目前有两个事务,分别命名为A和B,在并发环境下,容易出现以下问题。
丢失更新:A、B同时修改数据,A先,B后,A提交后B提交,B操作覆盖了A的操作,导致A丢失更新。
读脏数据:A修改数据,B读取数据;随后A撤销操作,则B读到脏数据。
不可重复读:B读取数据,A修改数据,B再次读取数据,发现数据和第一次读时不一致。
幻读:A读取了某个范围的数据,B在此范围内插入一条数据;A再次读取,结果不一样。

三、锁

在并发环境下,为解决并发一致性问题保证事务的隔离性,可采取封锁机制。当一个事务在进行操作时加锁,限制另一个事务的操作。
一般而言,为保证效率,锁的粒度不宜太大。在MySQL中,提供了行锁和表锁。
行锁:事务A操作数据时,只封锁被操作的行,事务B可以操作其他行的数据,并发程度高;
表锁:事务A操作数据时,封锁整个表,事务B要等A完成才能操作,并发度较低。
 
在读写方面数据库锁也分为读锁(共享锁)和写锁(排他锁)。
读锁:若事务A加了此锁,A可以对数据进行读取操作,但不能更新;其它事务也可以读,但不能修改;
写锁:若事务A加了此锁,A可以对数据进行读和写操作,其它事务不能读写,否则会阻塞。
 
上面所说的是悲观锁,MySQL中InnoDB也提供了乐观锁的实现——MVCC(多版本并发控制)。用通俗的方式解释悲观锁和乐观锁大概是这样:​
悲观锁:认为每次操作都会修改数据,每次都在操作前上锁;​
乐观锁:认为每次操作都不会修改数据,不上锁,但是会记录一个版本号或者时间戳,用来对比。
MVCC则是乐观锁的实现,它在每行记录后面都保存着两个隐藏的列,用来存储创建版本号和删除版本号。

四、隔离级别

若锁的操作要用户自己控制,会比较复杂,因此数据库管理系统提供了事务的隔离级别,使问题简单化。MySQL的隔离级别有四种,分别是:未提交读、已提交读、可重复读、可序列化。它们与并发一致性问题的关系如下表所示。MySQL默认隔离级别为:可重复读
未提交读:事务修改数据,即使未提交,其它事务依旧可见。
已提交读:事务修改数据提交之前,其他事务不可见。
可重复读:事务多次读取数据的结果都一样。
可序列化:解决了幻读问题。

五、存储引擎

说到数据库的并发问题,就要提一下MySQL的存储引擎。MySQL的存储引擎有很多种,最常用的还是MyISAM和InnoDB,它们的区别如下:
因此,一般在读操作比较多的情况下,MyISAM的效率更高,因为相比于InnoDB,它维护的东西要少,比如版本号,索引数据等。
但是InnoDB支持事务,而且在并发环境下优势显著。至于如何选择存储引擎,应根据具体情况而定。

总结

本文讲了数据库的事务以及并发一致性问题,并且引申出解决办法以及MySQL的存储引擎。这些知识,对于绝大多数从事互联网工作的人来说,是必须要掌握的,也是在面试中经常考察的点。
 

如果觉得对你有帮助,可以关注公众号:Max的日常操作,或扫码关注

                          

 
 

MySQL事务与并发的更多相关文章

  1. MySQL事务、并发问题、锁机制

    MySQL事务,并发问题,锁机制 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库 ...

  2. Mysql事务,并发问题,锁机制

    .什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束 ...

  3. Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  4. 【转】Mysql事务,并发问题,锁机制

    转自:http://www.cnblogs.com/fidelQuan/p/4549068.html 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成 ...

  5. Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  6. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  7. MySql事务概述

    事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 严格上来说,事务必须同时满足4个特性, ...

  8. mysql事务和并发控制

    谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...

  9. Mysql在高并发情况下,防止库存超卖而小于0的解决方案

    背景: 本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没 ...

随机推荐

  1. OpenWrite技术自媒体界的JVM一次编辑、随处发布

    原文 :https://mp.weixin.qq.com/s/KUtJ2dwhBRuJ2G_-PkQFEA 最懂你的科技自媒体管理平台 [实用小工具推荐]给科技或技术同学们推荐一款比较好用的工具,可以 ...

  2. 解决Python pip安装第三方包慢的问题

    解决Python pip安装第三方包慢的问题 主要是修改源,国内的源有几个 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi ...

  3. B 雷诺与奴隶主

    时间限制 : 5000 MS   空间限制 : 524288 KB 问题描述 自从周文武老师在班上吹嘘了"录试"这款游戏之后,PHD同学沉迷于其中无法自拔. "录试&qu ...

  4. 1+X Web前端开发(中级)理论考试样题(附答案)

    传送门 教育部:职业教育将启动"1+X"证书制度改革 职业教育改革1+X证书制度试点启动 1+X成绩/证书查询入口 一.单选题(每小题2分,共30小题,共 60 分) 1.在Boo ...

  5. JVM系列十(虚拟机性能监控神器 - BTrace).

    BTrace 是什么? BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保 ...

  6. 配置一个mariadb数据库《二》

                                                             mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...

  7. Mac osx下误删了mach_kernel文件,如何找回

    brew install xar 假设当前有一个 pkg 文件"filename.pkg",先使用以下命令解开 pkg: $ xar -xf filename.pkg 解压后发现其 ...

  8. 在scratch中怎样编写抓蝴蝶游戏

    打开scratch2.0软件,进入工作界面,将语言切换为简体中文:将默认的演员猫删除掉:在新建背景中选择“从背景库中选择背景”: 选择户外,来点一个背景图flower bed,然源后点下面的确定: 背 ...

  9. Git常用命令(二)

    git clone + URL 获取该项目源代码 $ git log 回顾提交历史 $ git log -p -(数字) 用来显示每次提交的内容差异+(数字)表示看最近几条 $ git log --s ...

  10. 微信小程序(黑马优购)完成!!{10天}

    微信小程序(黑马优购)完成!!{10天} 项目技术点: wxml, json, wxss, js, mina框架 附上视频链接添加链接描述