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语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
随机推荐
- 【原创】(七)Linux内存管理 - zoned page frame allocator - 2
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- JavaScript中闭包的使用和各种继承介绍
一.什么是闭包? (1)闭包的概念:a.闭包就是函数嵌套时,让局部变量变成自由变量的环境,是一种让局部变量进化的方式. b.定义在一个函数内部的函数. ...
- day 21作业
目录 一.定义一个类:圆形,该类有半径,周长,面积等属性,将半径隐藏起来,将周长与面积开放 二.使用abc模块定义一个phone抽象类 并编写一个具体的实现类 一.定义一个类:圆形,该类有半径,周长, ...
- 深入理解Netty框架
前言 本文讨论的主题是Netty框架,本着3W原则 (What 是什么?->Why 为什么?->How 如何做?)来一步步探究Netty原理和本质以及运用场景. 了解基本名词 1.BIO. ...
- Save your cats Aizu - 2224
Nicholas Y. Alford was a cat lover. He had a garden in a village and kept many cats in his garden. T ...
- 2019滴滴php面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...
- 一个最简单的springboot
现在项目里使用springboot,平时开发并不太关注springboot的一些基本配置,现在想整理一下springboot相关内容. 实际开发中都会因为各种业务需求在springboot上添加很多东 ...
- [POJ2262] Goldbach’s Conjecture
Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 48161 Accepted: ...
- 不安分的管家——Jenkins
占个位,持续补充. 一.使用Jenkins进行自动化部署 一直以来关于xx框架/中间件的技术博客有个奇怪的事情.这类文章特点大而全,重复率高,读者阅读完毕基本从安装到放弃. 作为一个使用者,我只是为了 ...
- php架构师都要会什么
架构师的成长离不开踩坑,不断试验各种方案,各种踩坑,从小坑到大坑,逐渐归纳.另外就是多学习多交流,兼收并蓄,不用特别在意细节,观其大略,了解常见的各种东西的核心价值与短板所在.一个程序和计算系统软件体 ...