MYSQL 悲观锁和乐观锁简单介绍及实现
1:悲观锁
1.1 特点:
每次查询都会进行锁行,怕“其他人”进行数据的修改。
1.2 实现步骤:
步骤1:开启事务test1,并对id=2的记录进行查询,并加锁,如:
步骤2:在事务test1没有进行commit的情况下,开启事务test2,并对id=2的记录进行修改,看执行结果
最终执行结果显示获取锁超时。
而在获取锁的过程中,执行 show processlist 命令可以看到:修改id=2的sql命令一直在等待锁。
而由于事务test1我没有commit,因此事务test2是获取不到锁的,因此就超时了。
步骤3:当我事务test1进行commit之后,我在事务test2中进行id=2的记录的修改操作时会是什么情况:
最终可以看到在事务test1进行commit之后,事务test2的修改操作终于成功了。
1.3 总结:
在事务中执行 select * from table where id = ? for update 并没有进行commit时,id = ? 的记录将进行锁行,另外一个事务想要修改 id = ? 的记录将会一直阻塞直至事务超时。
2:乐观锁
2.1 特点:
1:适用于读多于写的情况。
2:不会锁行,乐观主义。
2.2 实现方式:
常见的就是增加version字段或时间戳字段,每次修改都进行这个字段的更新。
2.3 那么如何解决多个人同时进行修改/新增/删除等操作时,最终只有一个执行成功?
我这里采用version的方式进行演示,测试步骤如下:
2.3.1:事务1的 DDL
2.3.2:事务2的 DDL
2.3.3:流程图
当事务1和事务2同时修改id=2 and version = 1 的记录的时候,最终事务1成功修改,而到事务2进行修改时符合条件的记录已经不存在了,因此修改失败!!
流程图如下:
结果:通过控制version,可以合理的解决资源竞争问题。
在日常开发中,可以利用事务的一致性,做更多的判断及操作。
MYSQL 悲观锁和乐观锁简单介绍及实现的更多相关文章
- mysql行锁、表锁。乐观锁,悲观锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- Mysql锁机制--乐观锁 & 悲观锁
Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...
- MySQL学习笔记(四)悲观锁与乐观锁
恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 关于MySql悲观锁与乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- 【MySQL锁】MySQL悲观锁和乐观锁概念
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- mysql的锁--行锁,表锁,乐观锁,悲观锁
一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...
- Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...
- mysql 悲观锁与乐观锁的理解
悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段. 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈. 一.悲观锁 顾名思义,就是对于数据的 ...
随机推荐
- (4)Linux常用的运维平台和工具
运维工程师使用的运维平台和工具包括: Web服务器:apache.tomcat.nginx.lighttpd 监控:nagios.ganglia.cacti.zabbix 自动部署:ansible.s ...
- FatMouse and CheeseI - I
FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension ...
- 2019HDU多校 Round3
09 K Subsequence #include <bits/stdc++.h> using namespace std; typedef long long ll; const int ...
- 【uva 11093】Just Finish it up(算法效率--贪心)
题意:环形跑道上有N个加油站,编号为1~N.第 i 个加油站可以加油Ai加仑,从加油站 i 开到下一站需要Bi加仑汽油.问可作为起点走完一圈后回到起点的最小加油站编号. 解法:我们把每个加油站的Ai, ...
- 【noi 2.6_9270】&【poj 2440】DNA(DP)
题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...
- 记录一些Python中不常用但非常好用的函数
zfill(): 方法返回指定长度的字符串,原字符串右对齐,前面填充0. print('Helloworld'.zfill(50))0000000000000000000000000000000000 ...
- linux命令行创建快捷方式
ln -s 源文件 目标目录 https://blog.csdn.net/ljw_jiawei/article/details/91044595
- Navicat 使用 SSH 通道
使用 Navicat for MySQL 通过跳板机登录 Mysql 时(使用 SSH 通道) 报错如下: SSH : Expected key exchange group packet from ...
- keepalived.conf说明
keepalived.conf说明 发表于 2017-06-04 | 分类于 运维相关 , Keepalived | | 阅读次数 348 | 字数统计 1,889 | 阅读时长预计 8 本文主要介绍 ...
- Linux 应用开发----socket编程笔记
Linux socket编程 套接字定义描述 套接字的域 AF_INET ====>IPv4 AF_INET6 ====>IPv6 AF_UNIX ====>unix 域 AF_UP ...