文档章节

mysql事务隔离级别和锁

比雷
 比雷
发布于 2016/12/09 15:35
字数 1463
阅读 106
收藏 0

事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解。

一、事务有四个基本特性:

    1、原子性(atomicity):数据库操作的最小基本单位,事务内的操作要么都成功,要么都失败,中途不能被打断。

    2、一致性(consistency):事务执行后数据从一种状态变成另外一种状态,不会存在事务的一部分数据写入了数据库,一部分没有写入。

    3、隔离性(isolation):事务之间独立执行,不相互干扰。

    4、持久性(durability):事务一旦提交,对数据库的修改是永久性的,不会改变。

、事务隔离

当多个线程同时执行读、算、写操作时,如果不加访问控制,系统势必会产生冲突,举例说明:

并发的时候,事务不断执行,这段时间简称T。T上有很多时间点,T0,T1,T2,T3,T4,T5..........T0为时间起点,数据库上有一个表user,字段name,point。

事务A:select name,point from user where id =1;

事务B:update user set point=point+1 where id =1;

脏读:首先事务B开始执行,在T1的时候事务A又开始执行,这个时候B事务并没有提交,事务A查询的值是事务B未提交的值,如果此时B事务回滚,会造成事务A查询到错误数据。这就是脏读。

不可重读:于是事务B修改point值的时候加锁,事务A只能在B事务提交后才能查询到结果,这样防止了脏读。但是如果事务A有两次相同的查询,分别在时间T0和T2,而再T1的时候事务B提交就会造成事务A两次相同查询的结果不一样。这就是所谓的不可重读。

幻读:为了防止出现重读,则需要在事务A查询的时候加读锁,在事务A提交之前,查询的数据不会被修改。出克脏读和不可重读,还会出现幻读的情况。出现幻读的情况也是一个事务内两次相同的查询结果不一样,和不可重读不一样的是,不可重读第二次查询的结果被修改或删除,而幻读第二次会查出新增的记录,可能是其他事务插入了满足条件的记录。而解决幻读的问题会复杂很多,需要对第一次查询的查询条件的一段范围加锁,具体就不细说了。

为了防止以上的情况发生,事务隔离产生了:

Read Uncommitted:这个隔离级别最低,会出现脏读、不可重读和幻读。这种隔离级别很危险,一般不用。

Read Committed:这个隔离级别稍微高一些,不会出现脏读,但会出现不可重读和幻读,oracle默认使用的事务隔离级别。

Repeatable Read:不会出现脏读和不可重读,会出现幻读。mysql默认的事务隔离级别。

Serializable:不会出现脏读、不可重读和幻读。因为串行化隔离需要很大的系统消耗,并发不好,一般不会使用。

而mysql用了一个并发版本控制机制mvcc,为了提高数据库并发量,允许事务并行读取写入数据,这个时候如果我们需要严格控制并发,就要加锁。

、处理事务常用方法

处理事务常用方法有排队法、排他锁、读锁、读写锁、mvcc.

1、排队法

最简单也是最重要的事务处理方法,用单一线程处理数据,避免了并发带来的同步问题。如redis,数据全部在内存中,则单线程处理所有Put、Get操作效率最高。

2、排他锁

可以利用排他锁的方式来快速隔离并发读写事务。一个事务获得锁后,其他事务的读写操作block住。

3、读写锁

如果是一系列读事务,不会对数据进行修改,那这些事务是可以并行的,因此一种针对读读场景的优化自然而然产生——读写锁。读写锁的核心是在多次读的操作中,同时允许多个读者来访问共享资源,提高并发性。

4、mvcc

本质是Copy On Write,也就是每次写都是以重新开始一个新的版本的方式写入数据,因此,数据库中也就包含了之前的所有版本。在数据读的过程中,先申请一个版本号,如果该版本号小于正在写入的版本号,则数据一定可以查询到,无需等到新版本完全写完即可返回查询结果。这种方式可以在读读不阻塞的前提下,实现读写/写读不阻塞,尽可能保证所有的读操作并行,而写操作串行。

写写是没法优化的,必须串行。

、调优

事务的调优的思路是在不影响业务应用的前提下:

第一,尽可能减少锁的覆盖范围,例如Myisam表锁到Innodb的行锁就是一个减少锁覆盖范围的过程;对于原位锁(排他锁、读写锁等)可变为MVCC多版本(本质仍然是减少锁的范围)。

第二,增加锁上可并行的线程数,例如读锁和写锁的分离,允许并行读取数据。

第三,选择正确锁类型,其中悲观锁适合并发争抢比较严重的场景;乐观锁适合并发争抢不太严重的场景。

© 著作权归作者所有

上一篇: java基础——注解
下一篇: RSA和MD5加密
比雷
粉丝 0
博文 10
码字总数 6579
作品 0
成都
程序员
私信 提问
加载中

评论(0)

MySQL MVCC && 事务隔离级别 && 锁

MySQL MVCC && 事务隔离级别 && 锁 InnoDB多版本并发控制——MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySQLS锁X锁read lockwrite lock http://my.oschina.net/xinxingegeya/bl......

秋风醉了
2014/07/30
649
0
mysql 开发进阶篇系列 6 锁问题

一.概述   在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁。接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议。 相比...

花阴偷移
2018/07/23
0
0
【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

01 概述 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数...

OliverFinn
03/24
0
0
MySQL/MariaDB中的事务和事务隔离级别

本文目录: 1.事务特性 2.事务分类  2.1 扁平事务  2.2 带保存点的扁平事务  2.3 链式事务  2.4 嵌套事务  2.5 分布式事务 3.事务控制语句 4.显式事务的次数统计 5.一致性非锁定读(快照...

shunfa888
03/31
0
0
mysql 4种事务隔离级别

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(...

蛋定龙
2015/10/23
361
1

没有更多内容

加载失败,请刷新页面

加载更多

略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
10
0
创建将T约束为枚举的泛型方法 - Create Generic method constraining T to an Enum

问题: I'm building a function to extend the Enum.Parse concept that 我正在构建一个函数来扩展Enum.Parse概念, Allows a default value to be parsed in case that an Enum value is ......

javail
今天
31
0
使用PHP的“注意:未定义的变量”,“注意:未定义的索引”和“注意:未定义的偏移量”

问题: I'm running a PHP script and continue to receive errors like: 我正在运行PHP脚本,并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\\wamp\\www\\mypat......

技术盛宴
今天
8
0
算法 : 一个整形一维数组,以及一个目标数,写一个方法,求出数组元素之和为该目标值的所有组合。

一个整形一维数组,以及一个目标数,写一个方法,求出数组任意两个元素之和为该目标值的所有组合。 function meetGroup($array, $hit){ $meet_groups =[]; foreach ($array as $...

冻结not
今天
35
0
win10下docker中安装sqlserver并使用navicat premiun连接

搜索镜像:docker search mssql 下载镜像:docker pull microsoft/mssql-server-linux 运行镜像:docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=[包含大小写字母、数字的长度不少于8位数的......

nie_yuange
今天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部