mysql:数据库的乐观锁和悲观锁
2023-06-13 09:15:30 时间
悲观锁:
悲观锁思想就是,当前线程要进来修改数据时,别的线程都得拒之门外~ 比如,可以使用select…for update ~
select for update 含义 select查询语句是不会加锁的,但是select for update除了有查询的作用外,还会加锁呢,而且它是悲观锁哦。至于加了是行锁还是表锁,这就要看是不是用了索引/主键啦。
没用索引/主键的话就是表锁,否则就是是行锁。
select for update 加锁验证 表结构:
//id 为主键,name为唯一索引
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`balance` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8
id为主键,select for update 1270070这条记录时,再开一个事务对该记录更新,发现更新阻塞啦,其实是加锁了。如下图:
我们再开一个事务对另外一条记录1270071更新,发现更新成功,因此,如果查询条件用了索引/主键,会加行锁~
我们继续一路向北吧,换普通字段balance吧,发现又阻塞了。因此,没用索引/主键的话,select for update加的就是表锁
乐观锁:
乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
这个作者写的很详细:图文并茂的带你彻底理解悲观锁与乐观锁
相关文章
- MySQL数据库每日备份并定时清理脚本
- MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded详解数据库
- MySQL数据库合并记录实现技巧(mysql合并记录)
- MySQL:设置活动会话过期时间(mysql过期时间)
- 解析MySQL函数返回类型指南(mysql函数返回类型)
- MySQL 导入文件:限制与解决方案(mysql导入文件大小)
- 深入浅出:MySQL数据库分离实践指南(mysql怎么分离数据库)
- 与恢复MySQL数据的删除及恢复技术(mysql数据的删除)
- 使用ADODB连接MySQL数据库(adodb连接mysql)
- 具MySQL数据库管理:简单优化你的工作(mysql数据库管理工)
- 记录MySQL统计不重复记录的完美方案(mysql统计不重复)
- MySQL管理多实例:一个解决方案(mysql多个实例)
- MySQL数据库:迁徙与转变(mysql数据库迁徙)
- MySQL 交叉连接深入理解(mysql交叉连接)
- MySQL行合并:提升数据库查询效率(mysql行合并)
- Connecting to MySQL Database: A Guide on Establishing a Successful Connection(mysql数据库连接)
- 如何通过Mysql优化教程提升数据库性能?(mysql优化教程)
- 深入了解MySQL:一篇完整的数据库指南(mysql大全)
- 妙用MySQL:快速优化数据库性能(优化mysql数据库方法)
- MySQL连接远程数据库:简单而高效的命令行方式(mysql连接远程数据库命令)
- 深入探究MySQL中的主键pk作用与使用方法(mysql中 pk)
- 如何在MySQL中使用ini文件来配置数据库(mysql中ini没有)
- 调试MySQL时遇到的困难CMD执行连接失败(cmd 连不上mysql)
- 数据库ARM平台上实现MySQL数据库连接(arm平台连接mysql)
- API实现快速导入MySQL数据库(api 导入mysql)
- 妙用命令行清理MySQL空间(cmd mysql 清屏)
- MySQL函数分类清晰,使用简单(mysql中函数的分类)
- MySQL百宝箱25字领略数据库查询的世界(mysql一百条查询命令)
- MySQL 数据库让查询年龄变得更轻松的一年(mysql一年查询岁数)
- 比较MySQL和V数据库的优劣哪个更适合你的应用(mysql x v)
- MySQL禁止连接的解决方法(mysql不允许被连接)
- MySQL中不等于符号的常用写法(mysql 不等于 写法)
- MySQL数据库不推荐使用root账户进行操作(mysql不是root)