mysql update 排他锁_Mysql 共享锁(lock in share mode),排他锁(for update)
共享锁(lock in share mode)
简介
允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁
如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁
共享锁事务之间的读取
session1:
start transaction;
select * from test where id = 1 lock in share mode;
session2:
start transaction;
select * from test where id = 1 lock in share mode;
此时session1和session2都可以正常获取结果,那么再加入session3 排他锁读取尝试
session3:
start transaction;
select * from test where id = 1 for update;
在session3中则无法获取数据,直到超时或其它事物commit
Lock wait timeout exceeded; try restarting transaction
共享锁之间的更新
当session1执行了修改语句:
session1:
update test set name = 'kkkk' where id = 1;
可以很多获取执行结果。
当session2再次执行修改id=1的语句时:
session2:
update test set name = 'zzz' where id = 1;
就会出现死锁或者锁超时,错误如下:
Deadlock found when trying to get lock; try restarting transaction
或者:
Lock wait timeout exceeded; try restarting transaction
必须等到session1完成commit动作后,session2才会正常执行,如果此时多个session并发执行,可想而知出现死锁的几率将会大增。
session3则更不可能
结论:
mysql共享锁(lock in share mode)
允许其它事务也增加共享锁读取
不允许其它事物增加排他锁(for update)
当事务同时增加共享锁时候,事务的更新必须等待先执行的事务commit后才行,如果同时并发太大可能很容易造成死锁
共享锁,事务都加,都能读。修改是惟一的,必须等待前一个事务commit,才可
排他锁(for update)
简介
当一个事物加入排他锁后,不允许其他事务加共享锁或者排它锁读取,更加不允许其他事务修改加锁的行。
排他锁不同事务之间的读取
同样以不同的session来举例
session1:
start transaction;
select * from test where id = 1 for update;
session2:
start transaction;
select * from test where id = 1 for update;
当session1执行完成后,再次执行session2,此时session2也会卡住,无法立刻获取查询的数据。直到出现超时
Lock wait timeout exceeded; try restarting transaction
或session1 commit才会执行
那么再使用session3 加入共享锁尝试
select * from test where id = 1 lock in share mode;
结果也是如此,和session2一样,超时或等待session1 commit
Lock wait timeout exceeded; try restarting transaction
排他锁事务之间的修改
当在session1中执行update语句:
update test set name = 123 where id = 1;
可以正常获取结果
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
此时在session2中执行修改
update test set name = 's2' where id = 1;
则会卡住直接超时或session1 commit,才会正常吐出结果
session3也很明显和session2一样的结果,这里就不多赘述
总结
事务之间不允许其它排他锁或共享锁读取,修改更不可能
一次只能有一个排他锁执行commit之后,其它事务才可执行
不允许其它事务增加共享或排他锁读取。修改是惟一的,必须等待前一个事务commit,才可
mysql update 排他锁_Mysql 共享锁(lock in share mode),排他锁(for update)相关推荐
- Mysql 共享锁(lock in share mode),排他锁(for update)
共享锁(lock in share mode) 简介 允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁 如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁 共享锁事务之间的读 ...
- mysql普通查询排他锁_MySql 共享锁 排他锁
行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突,行级锁分为共享锁和排他锁两种. 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁.其他用户可以并发读取 ...
- mysql share mode_mysql锁:mysql lock in share mode 和 select for update
select ... lock in share mode select ... for update 注意点: 1.都在事务内起作用; 2.所涉及的是行锁(即innodb引擎); 3.保证当前ses ...
- mysql select lock in share mode_深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
概念和区别 SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS ...
- mysql排他锁_mysql共享锁与排他锁
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能 ...
- mysql mdl 锁_MySQL源码学习:MDL字典锁
什么是MDL MDL,Meta Data lock,元数据锁,一般称为字典锁.字典锁与数据锁相对应.字典锁是为了保护数据对象被改变,一般是一些DDL会对字典对象改变,如两个TX,TX1先查询表,然后T ...
- MySQL之事务 索引 锁_MySql 知识点之事务、索引、锁原理与用法解析
本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句, ...
- mysql 唯一索引 死锁_MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇
毫不夸张的说,有一半以上的死锁问题由唯一索引贡献,后面介绍的很多死锁的问题都跟唯一索引有关.这次我们讲一段唯一索引 S 锁与 X 锁的爱恨情仇 我们来看一个简化过的例子 # 构造数据 CREATE T ...
- mysql罏在十三_MySQL高级知识(十三)——表锁
前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...
最新文章
- QS世界大学最新排名公布:清华超过耶鲁,MIT仍居榜首,12所中国高校跻身百强...
- 跨链(8)Cosmos之“跨链交互协议IBC”
- mysql用in报错_Mysql子查询IN中使用LIMIT
- UE4学习-新建C++组件、编码遇到问题
- 关于Spring的事务Transactional,锁同步,并发线程
- C语言学习笔记(五):《C语言深度剖析》笔记
- Vue中this.$router.replace和this.$router.push的区别
- [转] TextField的restrict属性妙用
- 菊子曰获取模板的草稿{29C28FD771BA4B0D8693}
- 算法:Reverse Words in a String(翻转字符串里的单词)
- 手机邮箱服务器设置安全类型,手机邮箱设置
- 加速开发效率,最低1元起拍,来戴尔官网领走你的高效编程神器Optiplex 5070!
- 计算机软件考试成绩查询时间,2020年计算机软考什么时候出成绩,怎么查成绩?|...
- 2011年新的个人纳税情况
- Vue 使用XLSX导出excel,并且设置标题背景颜色、字体、居中。并且在前端导出成excel文件
- 足球大数据预测中欧亚大小球随时间变化的处理
- 图扑数字孪生智慧社区,助力社区数字化转型
- 视频剪辑需要专门报班去学吗?
- 基础练习16-分解质因数
- 自己动手画CPU之汉字字库存储芯片扩展实验