mysql中的锁机制之悲观锁和乐观锁
1、悲观锁?
悲观锁顾名思义就是很悲观,悲观锁认为数据随时就有可能会被外界进行修改,所以悲观锁一上来就会把数据给加上锁。悲观锁一般都是依靠关系型数据库提供的锁机制,然而事实上关系型数据库中的行锁,表锁不论是读写锁都是悲观锁。
2、乐观锁?
乐观锁顾名思义,就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不会去对数据进行加锁。但是在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现乐观锁。乐观锁不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。
2.1、为什么要使用乐观锁呢?
①、对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁会阻塞所有读取,降低了吞吐量
②、最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题
③、换句话说,如果读写比例差距不是非常大或者你的系统没有响应不及时,吞吐量瓶颈问题,那就不要去使用乐观锁,它增加了复杂度,也带来了额外的风险
2.2、乐观锁的实现方式
前期准备工作(准备数据表和测试数据):
CREATE TABLE `employee` (
`id` int() NOT NULL AUTO_INCREMENT,
`name` varchar() CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`dep_id` int() NULL DEFAULT NULL,
`age` int() NULL DEFAULT NULL,
`salary` decimal(, ) NULL DEFAULT NULL,
`cus_id` int() NULL DEFAULT NULL,
`version` int() NULL DEFAULT NULL COMMENT '用来给乐观锁进行标识的字段',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_name_age`(`name`, `age`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- 插入测试数据
INSERT INTO `employee` VALUES (, '李白', , , 1000.00, , );
INSERT INTO `employee` VALUES (, '韩信', , , 2000.00, , );
INSERT INTO `employee` VALUES (, '露娜', , , 2500.00, , );
INSERT INTO `employee` VALUES (, '公孙离', , , 3000.00, , );
INSERT INTO `employee` VALUES (, '虞姬', , , 3500.00, , );
INSERT INTO `employee` VALUES (, '孙尚香', , , 5000.00, , );
INSERT INTO `employee` VALUES (, '马可波罗', , , 5000.00, , );
INSERT INTO `employee` VALUES (, '后羿', , , 4000.00, , );
2.2.1、版本号的实现方式:
①、就是给数据增加一个版本标识,在数据表上增加一个version字段
②、每次更新把这个字段加1
③、读取数据的时候把version读出来,更新的时候比较version
④、如果还是开始读取的version就可以更新了
⑤、如果现在的version比老的version大,说明有其他事务更新了该数据,并增加了版本号
⑥、这时候得到一个无法更新的通知,用户自行根据这个通知来决定怎么处理,比如重新开始一遍
版本号的方式实现乐观锁示例:
-- 先获取version字段的值,这里version字段的值目前是:
SELECT version FROM employee WHERE id = ; -- 更新该条数据的时候做数据验证,更新成功后将version字段的值累加1,更新条件除了id还要加上version=上面取出来的值 才能进行更新
UPDATE employee SET `name` = '李白大魔王',version = version + WHERE id = AND version = ;
示例截图:

2.2.2、时间戳的实现方式:
①、和上面的版本号基本一样,只是通过时间戳来判断而已,注意时间戳要使用数据库服务器的时间戳不能是业务系统的时间
②、同样是在需要乐观锁控制的table(表)中增加一个字段,字段名称无所谓
③、字段类型使用时间戳, 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比
④、如果一致则OK 执行更新操作,否则就是版本冲突
mysql中的锁机制之悲观锁和乐观锁的更多相关文章
- 大话Linux内核中锁机制之RCU、大内核锁
大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...
- 接上SQL SERVER的锁机制(一)——概述(锁的种类与范围)
二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...
- Linux内核中锁机制之RCU、大内核锁
在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...
- MySQL 中的WAL机制
本文主要概括的是 WAL 机制涉及的三种日志,具体与其他组件的联系.执行可查看 一条 sql 的执行过程详解 .MySQL中的事务原理和锁机制 . 是什么 WAL,全称是Write-Ahead Log ...
- (转)SQL SERVER的锁机制(一)——概述(锁的种类与范围)
锁定:通俗的讲就是加锁.锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数 ...
- SQL SERVER的锁机制(一)——概述(锁的种类与范围)
锁定:通俗的讲就是加锁.锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数 ...
- (转)SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
- (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...
- SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
随机推荐
- Shell之变量
目录 Shell之变量 参考 变量命名规则 变量语法规范 四种变量类型 系统变量 特殊变量 变量的使用 变量内容的删除和替换 Shell之变量
- Shell之Function与Source
目录 Shell之Function与Source 参考 Fuction的编写 Source的使用 Shell之Function与Source
- springmvc中重定向该如何处理?
如果登录成功,会重定向到系统首页 response.sendRedirect("jsp/frame.jsp"); 在springmvc中,应该如何处理?是否可以直接使用 retur ...
- 使用lombok中的log
idea中安装lombok插件 引入lombok依赖 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> ...
- cogs2550. 冰桥,升起来了!
[问题背景] 11月16日: 今天要来到南极洲的一角来考察啦!南极的空气真的很好呢,只不过有点冷,雪什么的真是太可爱了!这次我要在一个冰谷(应该说是山谷的地方)考察,考察点在这山谷的两边(希望不要掉下 ...
- 【元学习】Meta Learning 介绍
目录 元学习(Meta-learning) 元学习被用在了哪些地方? Few-Shot Learning(小样本学习) 最近的元学习方法如何工作 Model-Agnostic Meta-Learnin ...
- sql server中Set与select的区别
Set与select的区别 Set select 同时多个变量赋值 不支持 支持 表达式返回多个值时 出错 将返回的最后一个值赋给变量 表达式未返回值 变量被null赋值 变量保持原始值
- LeetCode初级算法--链表02:合并两个有序链表
LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- idea+springboot+mybatis逆向工程
前提:使用idea开发,基于springboot.用到了mybatis的逆向工程 因为之前用eclipse开发ssm比较多,现在转idea 使用springboot 踩了一些坑,在这记录一下~ 注意事 ...
- python编程系列---Pycharm快捷键(更新中....)
以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...