文档章节

MySQL事务与锁

abing_hu
 abing_hu
发布于 2017/04/07 15:52
字数 1096
阅读 17
收藏 0

事务的隔离级别

SQL标准定义的4个隔离级别为:

  • READ UNCOMMITED(未提交读) 事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,也被称为脏读。这个级别是隔离级别中最低的,实际情况基本不用。
  • READ COMMITED(提交读) 事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果(两次同样的查询之间可能会有其他事务提交修改)。阿里云MySQL的默认事务隔离级别
  • REPEATABLE READ(可重复读) 该事务界别解决了脏读的问题,也保证了在同一个事务中多次读取同样记录的结果是一致的(通过数据快照)。标准MySQL的默认事务隔离界别 但是理论上,可重复读隔离级别还是无法解决另外一个幻读的问题。所谓幻读,指的是当前某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(会读取出新增的数据行)。 MySQL InnoDB存储引擎通过多版本兵法控制(MVCC)解决了幻读的问题。基本原理就是通过在每行记录后面保存两个隐藏的列来实现,一个保存行的创建时间,另一个保存行的过期时间(或删除时间)。当然存储的不是实际时间值,而是系统版本号。每开始一个事务,系统版本号就会自动递增。事务开始时刻的系统版本号会做为事务的版本号,用来和查询到的每行记录的版本号进行比较。具体详情可参看《高性能MySQL》的1.4多版本并发控制章节。
  • SERIALIZABLE(可串行化) 最高的事务隔离级别,通过强制事务串行执行,避免了前面幻读的问题。简单来说,该事务会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中很少用到这个隔离界别。

MySQL中的事务

MySQL默认采用自动提交(AUTOCOMMIT)模式。也就是说,如果不是显示地开始一个事务,则每个查询都被当作一个事务执行提交操作。

MySQL锁

MySQL的锁分为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。读锁是共享的,或者说是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。 InnoDB在事务执行过程中,会自动加锁,并在执行COMMIT或ROLLBACK的时候释放,所有的锁都是在同一时刻释放的。这里描述的锁定都是隐式锁定,InnoDB除了隐式的锁定还支持通过特定的语句来进行显示锁定。

  • 增加共享锁:SELECT ... LOCK IN SHARE MODE
  • 增加排他锁:SELECT ... FOR UPDATE

MySQL事务与锁的应用

现在有个需求要实现一个图片分发的功能,一张图片只能分发给两个人,如何实现才能不出现图片超发的情况?

在不考虑性能的前提下我们可以通过MySQL事务和显示锁来解决这个问题:

  1. 开始事务,START TRANSACTION
  2. 使用排他锁方式,SELECT 图片分发次数<2
  3. 简单业务记录
  4. 更新图片分发次数
  5. 结束事务,COMMIT

使用事务+显示锁的方式,可以使操作同一行的所有事务串行化处理,从而解决并发写的问题。

最后考虑到更高的性能处理,该问题还可以使用Redis事务的方式解决(WATCH+MULTI+EXEC),具体详情大家可以谷歌下。

© 著作权归作者所有

abing_hu
粉丝 11
博文 29
码字总数 7098
作品 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
599
0
MySQL中的共享锁与排他锁

在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、...

steven
2016/09/23
75
0
使用mysql中的锁解决高并发问题

为什么要加锁 多核计算机的出现,计算机实现真正并行计算,可以在同一时刻,执行多个任务。在多线程编程中,因为线程执行顺序不可控导致的数据错误。比如,多线程的理想状态是这样的 但是实际情...

紫葡萄0
2018/11/23
0
0
mysql 开发进阶篇系列 6 锁问题

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

花阴偷移
2018/07/23
0
0
MySQLwwwhj8828com18088045700锁分析和监控

通常在MySQL的管理和监控中,Active Session(活动会话)是监控指标中的一个很重要的指标,通过活动会话监控,可以很清楚的了解到数据库当前是否有SQL堆积,是否处于非常繁忙的状态。那么除了...

1597538646291241
2018/10/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
11
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部