共享锁、排他锁

InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X)。共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁;排他锁是修改数据时加的锁,可以读取和修改数据,一旦一个事务对该行数据加锁,其他事务将不能再对该数据加任务锁。

共享锁(S)

排它锁(X)

共享锁(S)

允许

不允许

排它锁(X)

不允许

不允许

x轴:事务A拥有的锁

y轴:事务B申请的锁

注:一个事务在某一行数据上加上排它锁后,其他事务不能再在这行数据加任何锁,无法进行 update 与 delete,但是普通的 select 是可以的,因为普通的 select 不加任何锁,当 select .... from ... for update 时才会加上排它锁。

并发事务带来的问题

1.数据丢失(两个事务同时修改一行数据,其中一个事务异常回滚,导致更新失败)

解决办法:未提交读(Read Uncommitted):在事务 B 读取数据时,事务 A 读取数据加了共享锁,修改数据时加了排它锁。这种隔离级别,会导致脏读、不可重复读以及幻读。

未提交读会导致脏读、不可重复读、幻读的原因:尽管 A 持有排它锁,避免了两个事务同时修改的情况,但是普通的 select 不持有锁,还是可以读到数据的,所以事务 A 多次修改数据,事务 B 中的查询还是可以看到的。

2.脏读(一个事务的执行期间,另一个事务读到了没有提交数据)

解决办法:已提交读(Read Committed):在事务 B 读取数据时增加了共享锁,一旦读取,立即释放锁,事务 A 读取修改数据时增加了行级排他锁,直到事务结束才释放锁。

也就是说,事务 B 在读取数据时,事务 A 只能读取数据,不能修改。当事务 B 读取到数据后,事务 A 才能修改。

这种隔离级别,可以避免脏读,但依然存在不可重复读以及幻读的问题。

已提交读会导致不可重复读、幻读的原因:事务 B 没有提交就将锁释放,导致事务 A 可以对数据进行任意修改,修改后,事务 B 再次获取共享锁查询,查询到跟之前读取不一致的数据。

3.不可重复读(一个事务的执行期间,另一个事务连续两次读取到的值不一样)

解决办法:可重复读(Repeatable Read):在事务 B 读取数据时增加了共享锁,事务结束,才释放锁,事务 A 读取修改数据时增加了行级排他锁,直到事务结束才释放锁。

也就是说,事务 B 在没有结束事务时,事务 A 只能读取数据,不能修改。当事务 B 结束事务,事务 A 才能修改。

这种隔离级别,可以避免脏读、不可重复读,但依然存在幻读的问题。

可重复读导致幻读的原因:可重复读是加的行级锁,而幻读是满足查询条件的前提下数据量发生变化,即发生 insert 或 delete操作。

4.幻读(一个事务的执行期间,另一个事务连续两次读取到的数量不同)

解决办法:可序列化(Serializable):在事务 A 读取数据时增加了共享锁,事务结束,才释放锁,事务 B 读取修改数据时增加了表级排他锁,直到事务结束才释放锁。

可序列化解决了脏读、不可重复读、幻读等问题,但隔离级别越来越高的同时,并发性会越来越低。

小结

可以看出,控制数据库并发带来的问题依赖的是锁粒度的扩大来解决的。

但是隔离级别越大,并发性就越差,如果业务场景允许的情况下,适当减小隔离级别是处理并发的一种手段。

mysql事务怎么加排他锁_八种方法实现CSS页面底部固定 - SegmentFault 思否相关推荐

  1. flex 底部固定_详解八种方法实现CSS页面底部固定

    当我们在写页面时经常会遇到页面内容少的时候,footer会戳在页面中间或什么?反正就是不在最底部显示,反正就是很难看,下面要讲的布局就是解决如何使元素粘住浏览器底部, 方法一:footer高度固定+绝 ...

  2. mysql树形结构 无限分类_使用 authenticationDatabase 参数连接 aliyun 上的 MongoDB - SegmentFault 思否...

    在一些系统中,对内容进行分类是必需的功能.比如电商就需要对商品做分类处理,以便于客户搜索:论坛也会分为很多板块:门户网站.也得对网站的内容做各种分类. 分类对于一个内容展示系统来说是不可缺少的,本博客 ...

  3. access 合并多行字符串_八种方法玩转字符串合并,这篇文章全都给你讲明白!...

    在日常工作过程中,经常会遇到要把一串字符拼接到一起的情况. 你是不是还一直在用"&"连接符来合并字符串呢?当遇到很多个字符串需要合并的时候,这种方法又费时又费力,那有没有其 ...

  4. mysql 事务排他锁_[数据库事务与锁]详解六: MySQL中的共享锁与排他锁

    注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大 ...

  5. mysql如何加悲观锁_【mysql】关于悲观锁

    关于mysql中的锁 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等 ...

  6. mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  7. SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

    文章目录 介绍 加锁情况分析 明确指定主键,并且数据真实存在,锁定行 明确指定主键,但数据不存在,不加锁 主键不明确,锁定整个表 无主键,锁定整个表 应用场景 介绍 1.FOR UPDATE 加的锁是 ...

  8. Mysql的共享锁和排他锁(转载)

    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能 ...

  9. MySQL事务隔离与行锁的关系

    MySQL事务隔离与行锁的关系 1. MySQL事务隔离 2. MySQL行锁 3. 事务隔离问题 1. MySQL事务隔离 MySQL事务详解 MySQL事务详解中介绍了事务隔离相关概念原理,如果是 ...

最新文章

  1. 报告 | 从20世纪70年代至今,自动驾驶汽车的发展经历了哪些历史性的变革?
  2. javascript (function(){})()
  3. 【LeetCode】390.消除游戏
  4. 体育馆黑名单系统 的设定
  5. OpenCV均值漂移meanshift algorithm算法的实例(附完整代码)
  6. 服务器防渗透(1)--信息收集
  7. ES5-12 【utils】继承深入、call、apply、圣杯模式、模块化
  8. 欢乐纪中某B组赛【2019.1.28】
  9. java字符编码方式总结
  10. SQL_create_table创建表
  11. 前端常用效果(3)带动画的比较型柱状图
  12. 你先说什么事,我再决定有没有空
  13. 深圳试行“智能行人过街系统”,行人违规将被“拉出来示众”
  14. 引入pingfang SC字体
  15. 微信小游戏引擎插件,Creator 使用教程!
  16. 百度地图API:自定义途经点路线拼接
  17. 计算机四级-数据库工程师(数据库原理部分)
  18. python生成中文字符画_在线汉字转为字符字,字符字生成器,在线生成字符字
  19. 2022年湖南省临床执业医师考试第三单元综合(二)
  20. VSTO二次开发PPT插件

热门文章

  1. 里程碑:BCH网络出现首例Schnorr Multisig交易
  2. OKEx比特币现金震荡 巴西央行公布新区块链项目
  3. 大数据技术学习路线,有信心能坚持学习的朋友,从现在开始吧
  4. 用StatSVN统计SVN服务器项目的代码量
  5. windows 2008+Oracle 11g R2 故障转移群集配置
  6. switch case in protected scope 异常解决
  7. SAP Basis 日常管理
  8. 《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】
  9. 从强制卸载Office到强制安装WPS
  10. 部门工作中的“求同存异”法则