很多程序员都学过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. 【python系统学习13】类(class)与对象(object)

    目录: 类(class)和实例 类 实例 小测试 对象(object) 属性和方法 类的创建 伪代码 示例代码 属性(attribute) 方法(method) 类的实例化 实例对象调用类属性和方法 ...

  2. linux 访问windows 共享文件

    用到的方法是 CIFS (Common Internet File System)windows自己的网络文件系统 操作系统: Linux为 debian. Windows 为 windows 8   ...

  3. 求你了,别再问我Zookeeper如何实现分布式锁了!!!

    导读 真是有人(锁)的地方就有江湖(事务),今天不谈江湖,来撩撩人. 分布式锁的概念.为什么使用分布式锁,想必大家已经很清楚了.前段时间作者写过Redis是如何实现分布式锁,今天这篇文章来谈谈Zook ...

  4. 手动搭建I/O网络通信框架2:Socket和ServerSocket入门实战,实现单聊

    第一章:手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 在第一章中运用Socket和ServerSocket简单的实现了网络通信.这一章,利用BIO编程模型进行 ...

  5. 三通道低功耗ASK低频唤醒接收器PAN3501完全替代AS3933/GC3933

    低频唤醒接收器PAN3501软硬件兼容AS3933/GC3933,且新增了寄存器功能,可直接替换,供应稳定,高性价比. 产品介绍:    PAN3501是一款最多三个通道接收的低功耗ASK接收机,可用 ...

  6. 微信小程序之界面交互反馈

    交互反馈就是在用户出发某事件之后,给用户一个反馈信息,这要是一个很友好的习惯. 在小程序中是通过一下几种方式实现的: 1.wx.showToast()方法 showToast: function (p ...

  7. go 内存优化

    一.斐波那切数列优化 package main import ( "time" "fmt" ) const LIM = 41 var fibs [LIM]uin ...

  8. Python爬虫系列(四):Beautiful Soup解析HTML之把HTML转成Python对象

    在前几篇文章,我们学会了如何获取html文档内容,就是从url下载网页.今天开始,我们将讨论如何将html转成python对象,用python代码对文档进行分析. (牛小妹在学校折腾了好几天,也没把h ...

  9. 发布公开的pod

    发布公开的pod 方便项目 通过cocoapods 使用,便于版本版本管理,下面是简单步奏: 0.首次操作先要注册Trunk: pod trunk register zhujin001xb@163.c ...

  10. Redis linux 下安装

    Redis linux 下安装 下载Redis安装包,可以从Redis中文网站中下载 下载地址:http://www.redis.cn/download.html Redis4.0 稳定版本 使用&l ...