很多程序员都学过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. SHTC3温湿度传感器的使用

    1.SHTC3简单说明 SHTC3是一个检测温度.湿度的传感器,可以检测-40℃~125℃的温度范围和0%~100%的湿度范围. SHTC3的工作电压范围为:1.62V~3.6V. SHTC3使用的通 ...

  2. Light of future-冲刺Day 3

    目录 1.SCRUM部分: 每个成员进度 SCRUM 会议的照片 签入记录 代码运行截图 发布界面 用户浏览界面 管理员浏览界面 2.PM 报告: 时间表 燃尽图 任务总量变化曲线 每名成员的贡献比 ...

  3. 1062 Talent and Virtue (25分)(水)

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  4. 1031 Hello World for U (20分)

    Given any string of N (≥) characters, you are asked to form the characters into the shape of U. For ...

  5. 谈谈CSS3中display属性的Flex布局(弹性布局)

    最近为了微信小程序,回忆起之前有接触过的弹性布局(display:Flex) 网上摘录的原文地址:https://www.cnblogs.com/xuyuntao/articles/6391728.h ...

  6. Windows 手动安装 Apache24 web服务器

    文章更新于:2020-02-18 按照惯例,需要的文件附上链接放在文首 文件名:httpd-2.4.41-o111c-x64-vc15-r2.7z 文件大小:6.1MB 下载链接:https://ww ...

  7. Linux基础篇,文本数据的比较与排序:sort、uniq、comm、diff

    一.sort sort命令用于将文本文件内容以行排序 sort [选项参数] [-o<输出文件>] [-t<分隔字符>] [+<起始栏位> -<结束栏位> ...

  8. C语言 文件操作(八)

    1.删除文件或目录 int remove(char * filename); [参数]filename为要删除的文件名,可以为一目录.如果参数filename 为一文件,则调用unlink()处理:若 ...

  9. mysql中的PACK_KEYS

    原文  http://jackyrong.iteye.com/blog/2170222 在mysql的myisam引擎中,有一个是容易忽视的,叫压缩索引PACK_KEYS , myISAM使用前缀压缩 ...

  10. web系统安全运营之基础- 基于DFA算法的高性能的敏感词,脏词的检测过滤算法类(c#).

    [概述]做好一个web系统的安全运维,除了常规的防注入,防入侵等,还有一个检测并过滤敏感词,脏词..  这件事做得不好,轻则导致一场投诉或纠纷,重则导致产品被勒令关闭停运. 废话少说,先看下代码,可以 ...