文档章节

mysql事务隔离级别和锁

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

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

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

© 著作权归作者所有

共有 人打赏支持
上一篇: 待办目录
下一篇: RSA和MD5加密
比雷
粉丝 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数据库事务隔离级别(Transaction Isolation Level)

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

嘻哈开发者
2016/01/06
79
0
mysql 4种事务隔离级别

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

蛋定龙
2015/10/23
293
0
高性能MySql学习笔记——锁、事务、隔离级别

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

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

没有更多内容

加载失败,请刷新页面

加载更多

《激荡三十年》读书笔记的相关感悟3300字

《激荡三十年》读书笔记的相关感悟3300字: 《激荡三十年》是吴晓波以编年体的方式记录的中国1978年改革开放后至2008年的30年的企业史。这套被称为“新货殖列传”的“企业史记”记录了三十年...

原创小博客
23分钟前
1
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部