文档章节

mysql事务隔离级别和锁

比雷
 比雷
发布于 2016/12/09 15:35
字数 1463
阅读 11
收藏 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
博文 10
码字总数 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
0
mysql 开发进阶篇系列 6 锁问题

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

花阴偷移
07/23
0
0
mysql 4种事务隔离级别

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

蛋定龙
2015/10/23
293
0
MySQL数据库事务隔离级别(Transaction Isolation Level)

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

嘻哈开发者
2016/01/06
79
0
事务的四大特性和隔离级别

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

LYQ1990
2016/04/29
69
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

谷歌 Fuchsia 上手体验,将取代Android/win10

在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重,在平板以及大屏幕设备上表现糟糕,...

linux-tao
18分钟前
1
0
List、Array与ArrayList

数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3];//赋值 s[0]="a"; s[1]="b"; s[2]="c";//修改 s[1]="b1"; 但是数组...

shimmerkaiye
21分钟前
0
0
Linux 的Lnmp环境下为mysql添加环境变量

一.问题 在Linux 安装完Lnmp 环境后 , 连接Mysql 告诉没有这条命令 mysql -uroot -p 命令失效 因为是源码安装的,所以会出现这样的的原因 。集成环境是不会出现的。 其实很简单,只需要给m...

15834278076
23分钟前
3
0
apolloxlua include函数

include函数不是单独使用的函数, 他并不是标准库的一部分, 你可以使用include函数将某个后缀为 .aop的文档包含到你的文档流中。 因为include是单独处理流, 所以不会在主处理流程中有所表示...

钟元OSS
27分钟前
0
0
【转载分享】做一名较真的工程师

近些年与我共事过的同事,一定知道我至今仍有一个较真的性格。我会:指出同事所写代码的不当命名问题(并帮助改进);指出同事所写文档中的逻辑混乱问题(并辅以修订);指出同事所写PPT中乱...

HellerZhang
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部