当前位置: 首页 > news >正文

mysql数据库中事务锁的机制

读锁又称为共享锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

写锁又称为排他锁,简称X锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

共享锁就是多个事务只能读数据不能改数据,如果有其他的update操作需要等其他事务的读锁释放,才能加写锁(排他锁).

排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。

mysql InnoDB引擎默认的修改数据语句,update,delete,insert 都会自动给涉及到的数据加上排他锁,select 语句默认不会加任何锁类型。

如果加排他锁可以使用select ...for update 语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制

锁释放,数据库在事务提交之后锁才会释放。

下面开始验证

查看事务是否自动提交
SHOW VARIABLES LIKE 'autocommit';设置事务不自动提交
SET autocommit = 0开启事务1
start transaction;
读操作默认没有添加锁
select * from sys_user where id='1' 
UPDATE sys_user set `avatar`="头像1" where id='1';提交事务
commit work;开启事务2
start transaction;
查数据操作的时候添加读锁 共享锁   读操作默认没有 
select * from sys_user where id='1' LOCK IN SHARE MODE;
UPDATE sys_user set `avatar`="头像1" where id='1';提交事务
commit work;开启事务3
start transaction;
查数据操作的时候添加读锁 共享锁   读操作默认没有 
select * from sys_user where id='1'  LOCK IN SHARE MODE;
UPDATE sys_user set `avatar`="头像2" where id='1'commit work;

数据库的事务基本时默认的 不可重复读

开启事务1的时候 对其他事务没有任何影响

开启事务2 执行读操作,开启事务3 执行更新操作,在事务2提交前事务3不允许提交事务,当2提交后,3更新操作成功 事务可以提交.

开启事务2 执行读操作,开启事务3 读操作并且执行更新操作, 这时3的更新操作在等待, 如果这时再执行事务2的更新操作,事务2会报死锁回滚事务.

http://www.lryc.cn/news/441007.html

相关文章:

  • 并发工具类-CountDownLatch
  • 进程的重要函数
  • python 实现average median平均中位数算法
  • HTML概述
  • 【FFT】信号处理——快速傅里叶变换【通俗易懂】
  • 电脑升级WIN11之后需要注意哪些东西
  • GEE 教程:利用sentinel-5p数据进行长时序CO一氧化碳的监测分析并结合夜间灯光数据分析
  • 【教程】鸿蒙ARKTS 打造数据驾驶舱---前序
  • Html css样式总结
  • 决策树基础概论
  • Spring Boot集成Akka Cluster快速入门Demo
  • django学习入门系列之第十点《A 案例: 员工管理系统10》
  • Unity实战案例全解析:PVZ 植物卡片状态分析
  • 判断变量是否为有限数字(非无穷大或NaN)math.isfinite() 判断变量是否为无穷大(正无穷大或负无穷大)math.isinf()
  • idea使用阿里云服务器运行jar包
  • 解决nginx代理SSE接口的响应没有流式返回
  • 11 - TCPClient实验
  • React框架搭建,看这一篇就够了,看完你会感谢我
  • 【rust】rust条件编译
  • 一键文本提示实现图像对象高质量剪切与透明背景生成
  • 游戏客服精华回复快捷语大全
  • 国内版Microsoft Teams 基础版部署方案
  • 计算机网络 ---- OSI参考模型TCP/IP模型
  • 在Windows环境下部署Java的Web项目集成工具的整体流程和详细步骤
  • 9.18作业
  • 【算法】滑动窗口—最小覆盖子串
  • “Fast-forward“ in git-pull result
  • Oracle(133)如何创建表空间(Tablespace)?
  • Linux中权限和指令
  • 本地镜像发布到阿里云