文档章节

mysql事务隔离级别和锁

比雷
 比雷
发布于 2016/12/09 15:35
字数 1463
阅读 8
收藏 0
点赞 0
评论 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多版本(本质仍然是减少锁的范围)。

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

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

© 著作权归作者所有

共有 人打赏支持
比雷
粉丝 0
博文 8
码字总数 6579
作品 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 ⋅ 0

mysql 4种事务隔离级别

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

蛋定龙 ⋅ 2015/10/23 ⋅ 0

MySQL数据库事务隔离级别(Transaction Isolation Level)

数据库隔离级别有四种,应用《高性能mysql》一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMM...

嘻哈开发者 ⋅ 2016/01/06 ⋅ 0

事务的四大特性和隔离级别

一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。 二.事务的 四个特性(ACID ) 事务具有四个特性:原子性( Atomic...

LYQ1990 ⋅ 2016/04/29 ⋅ 1

mysql事务和锁 SELECT FOR UPDATE

事务: 当然有的人用begin /begin work .推荐用START TRANSACTION 是SQL-99标准启动一个事务。 当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 ro...

SibylY ⋅ 2016/08/22 ⋅ 0

高性能MySql学习笔记——锁、事务、隔离级别

为什么需要锁? 因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这...

凯文加内特 ⋅ 2016/01/26 ⋅ 0

Oracle和mysql的区别

一、数据库的主要类型 数据库类型主要可分为:网状数据库、关系数据库、树状数据库、面向对象数据库。在商业中最主要的是关系型数据库,例如:Oracle、DB2、Sybase、My SQL Server、Informa...

lampit凌宇 ⋅ 2017/06/20 ⋅ 0

Mysql InnoDB锁机制

一、MySQL锁机制概述: (一)什么是锁,以及为什么使用锁和锁的运作? 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,...

皮蛋和 ⋅ 2017/12/31 ⋅ 0

隔离级别和MVCC

-----本文章为个人理解,如有疑问或错误欢迎留言并讨论----- 谢谢。 昨天去去哪儿网面试,老周和老赵问了很多问题,大多关于细节,其中就包括事务隔离级别和MVCC,由于准备不够充分,所以今天...

浮生凤年 ⋅ 2015/07/14 ⋅ 0

数据库的并发控制

并发控制机制试图在多个事务中交叉(同时)执行Read和Write操作,并使得交叉执行的结果与串行调度执行的结果一样。这个交叉执行给人的感觉是事务在并行执行。并发控制非常重要,因为事务在共...

柳哥 ⋅ 2014/06/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

阿里云云栖社区 ⋅ 17分钟前 ⋅ 0

Ubuntu部署django问题汇总

使用Anaconda3的Python3.6的pip安装UWSGI报错 原因是gcc版本不兼容,安装4.7并修改gccsudo apt-get install gcc-4.7sudo mv /usr/bin/gcc /usr/bin/gcc.baksudo ln -s /usr/bin/gcc-4.......

wuyaSama ⋅ 20分钟前 ⋅ 0

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

猫耳m ⋅ 20分钟前 ⋅ 0

Docker减肥小记

如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察 如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无用的镜像、容器、网络和数据卷… 1、查看...

寰宇01 ⋅ 31分钟前 ⋅ 0

微信小程序中如何使用WebSocket实现长连接(含完整源码)

本文由腾讯云技术团队原创,感谢作者的分享。 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架、组件以及 API,在这个平台上面的想象空间很大。腾讯云研究了一...

JackJiang- ⋅ 38分钟前 ⋅ 0

定制库到Maven本地资源库

1.如果只有定制库的JAR文件 下载链接如下:pdf.jar 2.使用命令转换成Maven本地资源 mvn install:install-file -Dfile=/Users/manager/Downloads/clj-pdf-2.2.33.jar -DgroupId=clj-pdf -Dar......

年少爱追梦 ⋅ 43分钟前 ⋅ 0

高仿springmvc之xuchen-mvc

package org.mvc.framework.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.......

徐志 ⋅ 45分钟前 ⋅ 0

关于自定义URLStreamHandler的一次踩坑

关于自定义URLStreamHandler的一次踩坑 20180625 lambo init 说明 一般自定义实现url的协议解析.方案为实现URLStreamHandler.实现其 openConnection 就可以了, 如果我们执行 new URL("xx://...

林小宝 ⋅ 46分钟前 ⋅ 0

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

演示证书文件 链接: https://pan.baidu.com/s/1ijHNnMQJj7jzW-jXEVd6Gg 密码: vfva 所需jar包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependenc......

小帅帅丶 ⋅ 47分钟前 ⋅ 0

用Calendar 实现 计算 一段时间的毫秒值

Calendar c=Calendar.getInstance();c.add(Calendar.MONTH, -1);int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH)......

岸芷汀兰 ⋅ 50分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部