锁机制是数据库一个比较重要的机制,在处理事务的并发性方面起着至关重要的作用,我也看过好多关于锁机制的文章blog,什么悲观锁、乐观锁?什么共享锁、排他锁?还有什么行级锁、表级锁?另外还有读锁、写锁?oh,my god!怎么这么多锁?今天终于静下心来好好研究梳理一番这些烦人的锁。

这篇文章我想弄明白三个个问题:

一是把上面这些锁都是什么,怎么定义的搞明白;

二是把这些乱七八糟的锁什么场景下使用、怎么使用搞明白;

三是这些锁和事务之间是什么关系。

一、锁的分类

1.1、乐观锁和悲观锁(从策略上划分)

乐观锁:顾名思义就是非常乐观,非常相信真善美,每次去读数据都认为其它事务没有在写数据,所以就不上锁,快乐的读取数据,而只在提交数据的时候判断其它事务是否搞过这个数据了,如果搞过就rollback。乐观锁相当于一种检测冲突的手段,可通过为记录添加版本或添加时间戳来实现

 悲观锁:对其它事务抱有保守的态度,每次去读数据都认为其它事务想要作祟,所以每次读数据的时候都会上锁,直到取出数据。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性,但随之而来的是各种开销。悲观锁相当于一种避免冲突的手段。

选择标准如果并发量不大,或数据冲突的后果不严重,则可以使用乐观锁;而如果并发量大或数据冲突后果比较严重(对用户不友好),那么就使用悲观锁

**注意**:首先明确一点乐观锁和悲观锁是一种编程策略,并不是数据库具有悲观锁和乐观锁。

悲观锁实现代码

乐观锁两种实现方式

一是使用数据版本(Version)记录机制实现。这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值+1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。用下面的一张图来说明:

如上图所示,如果更新操作顺序执行,则数据的版本(version)依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行修改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作会失败。
       乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

乐观锁实现示例

1.2、共享锁和排它锁(从读写角度划分)

共享锁(S锁,Shared Lock):也叫读锁(Read Lock),持有S锁的事务只读不可写。如果事务A对数据D加上S锁后,其它事务只能对D加上S锁而不能加X锁。

排它锁(X锁,Exclusive Lock):也叫写锁(Write Lock),持有X锁的事务可读可写。如果事务A对数据D加上X锁后,其它事务不能再对D加任何锁,直到A对D的锁解除。

选择标准:数据库根据sql语句选择加什么锁

如何使用:数据库自身创建

1.3、表级锁和行级锁(从粒度角度划分)

表级锁(Table Lock):表级锁将整个表加锁,性能开销最小用户可以同时进行读操作当一个用户对表进行写操作时,用户可以获得一个写锁,写锁禁止其他的用户读写操作写锁比读锁的优先级更高,即使有读操作已排在队列中,一个被申请的写锁仍可以排在所队列的前列

 行级锁(Row Lock):行级锁仅对指定的记录进行加锁,这样其它进程可以对同一个表中的其它记录进行读写操作行级锁粒度最小,开销大,能够支持高并发,可能会出现死锁

选择标准:数据库根据sql语句选择加什么锁

如何使用:数据库自行加锁

在使用以下语句时,Oracle会自动应用行级锁:INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新.使用commit或者rollback释放锁。

关于共享锁排它锁、表级锁行级锁的解释清参考下面:

最后自己总结下:

如果执行insert、update、delete、select  ....  for update语句,表上共享锁,对应的数据行上会加行级排它锁。该表不能执行ddl语句,对应的数据行不能执行update、delete(因为排它锁会阻塞,直到锁释放),可以执行select语句,其他行数据可以执行除ddl的任何记录。

执行ddl语句会加表级排它锁。表里的所有数据都不能执行dml语句。

也证明了行级锁只有排他属性。

数据库的那些乱七八糟烦人的锁(数据库锁机制有这一篇就够了)相关推荐

  1. 网络编程懒人入门(三):快速理解TCP协议一篇就够

    1.前言 本系列文章的前两篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>.<网络编程懒人入门(二):快速理解网络通信协议(下篇)>快速介绍了网络基本通信协议及理论基 ...

  2. 冷热分离和直接使用大数据库_还不知道HBase冷热分离的技术原理?看这一篇就够了...

    作者:郭泽晖(索月),阿里巴巴技术专家 HBase是当下流行的一款海量数据存储的分布式数据库.往往海量数据存储会涉及到一个成本问题,如何降低成本.常见的方案就是通过冷热分离来治理数据.冷数据可以用更高 ...

  3. 网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!

    本文中文译文由作者"ably.io"发布于公众号"高可用架构",译文原题:<深入解读HTTP3的原理及应用>.英文原题:<HTTP/3 dee ...

  4. 如何彻底解决烦人的 MySQL 分库分表问题?写一个更好的数据库!

    作者 | 黄东旭 责编 | 郭   芮 我还清楚记得,五年前的这个时候,当时还在豌豆荚,午后与刘奇和崔秋的闲聊关于未来数据库的想象,就像一粒种子一样,到了今天看起来也竟枝繁叶茂郁郁葱葱,有点感慨.按照 ...

  5. 苹果电脑删除软件_软件自动开启很烦人?如何彻底关掉开机自动开启的应用程序...

    使用Mac的小伙伴有没有这样的烦恼,电脑一开机,一堆烦人的软件就自动开启了,让人很懊恼,如何才能彻底关掉开机自动开启的应用程序?mac开机启动项怎么设置?开机启动项要怎么禁止?今天就带大家解决这个懊恼 ...

  6. java scala_经过几天的Scala回归Java的10个最烦人的事情

    java scala 因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适. 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此 ...

  7. 经过几天的Scala回归Java的10个最烦人的事情

    因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适. 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此除了附加的运行时依赖关 ...

  8. 怎么关闭电脑开机自动启动的程序_软件自动开启很烦人?如何彻底关掉Mac电脑开机自动开启的应用程序?...

    使用Mac电脑的小伙伴有没有这样的烦恼,电脑一开机,一堆烦人的软件就自动开启了. 如何才能彻底关掉开机自动开启的应用程序?mac开机启动项怎么设置?开机启动项要怎么禁止?今天就带大家解决这个懊恼的问题 ...

  9. 苹果android怎么设置关闭,iPhone手机系统更新提醒太烦人,终于知道怎样彻底关闭了!...

    因为最新的系统往往是为最新款的手机"量身定制"的,特别是iPhone 用户应该更有感触.但是不想升级又总是收到提醒,真的很烦人有木有!今天绿豆就教你彻底解决,iPhone和安卓都有 ...

  10. wordpress修复插件_关于WordPress及其修复方法的15个最烦人的事情

    wordpress修复插件 Like most things in life, WordPress also has it's fair share of annoying things. Deali ...

最新文章

  1. oracle中的exists 和 not exists 用法详解
  2. 一次bug死磕经历之Hbase堆内存小导致regionserver频繁挂掉
  3. qt-designer使用教程2--调用退出
  4. 让我们开一家医生假条商店吧/E
  5. linux优化pdf,linux系统安全和优化.pdf
  6. mui组件 a 锚点定位(Demo案例演示)- 代码篇
  7. Control-Flow Enforcement Technology (CET)
  8. Linux下的网卡驱动程序的编写过程(转)
  9. JS判断一个页面是否已经打开
  10. sql数据库身份验证登录
  11. 短视频推广引流方案怎么做?看这五点,让你快速裂变涨粉
  12. linux系统能看抖音吗,在Linux系统下用XDroid来安装和运行抖音Android APP应用
  13. 谁说大象不能跳舞读后感
  14. 是什么原因才导致网站打开速度慢?
  15. 一次macbook安装iftop失败的经历及解决方式
  16. 将vasp结构优化的每一步(XDATCAR文件)转化成POSCAR文件,通过VESTA实现可视化
  17. 如何使用Ajax进行与服务器交互
  18. 预处理命令 文件包括
  19. mybatis入门实例(xml文件配置)
  20. 谷歌地图拼接软件_宽77米,高60米,南极小岛出现一个“巨洞”,谷歌地图清晰显示...

热门文章

  1. Web应用程序设计(一)——基础开发环境搭建
  2. linux 可道云_腾讯云linux+kodexplorer可道云搭建私有云盘
  3. wowza流媒体服务器最详细教程-wowza安装配置及优化
  4. www.icourse163.org中国大学MOOC网页端无法打开或显示不全的解决方法
  5. MATLAB生成(对角线上元素相同的)三对角矩阵的实例
  6. 《软件工程》第6章体系结构设计
  7. 手机验证码登录 添加 区号,国家,国家简写,国家中文名称,国旗展示
  8. 修复inspinia中popover的点击问题
  9. Android聊天软件开发(基于网易云IM即时通讯)——发送视频消息(六)
  10. 高速PCB设计中的屏蔽方法