在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言根据加锁的粒度区分
根据加锁的场景
全局锁
|
特点 | 表锁 | 行锁 |
---|---|---|
加锁层面 | mysql的server层 | 数据引擎层 |
引擎 | MyISAM、innoDB | InnoDB |
特点 | 不会死锁、开销小、加锁快、锁粒度大 | 易死锁、开销大、加锁慢、锁粒度小 |
很多情况都回引起死锁,大部分都是针对数据库操作有问题才会导致.比如
线程A和线程B都针对id=1和id=2进行修改并开启事务
线程A先修改了id=1导致id=1被线程A上锁
线程B修改了id=2导致id=2被县城B上锁
此时线程A要等待id=2释放锁后执行对id=2的操作
而线程B要等待id=1释放锁后怼id=1的操作从而达到了一个循环死锁的情况
处理这种问题有两个策略:
属于行锁的一种情况
针对的是事务在加锁后锁住的某一条记录信息
触发情况:查询条件精准命中且命中的条件字段是唯一的
例如:update t1 set name="张三" where id=12138
作用:记录在被当前事务管理时,加上锁之后不会被其他事务获取产生“重复读”和“数据脏读”的问题
属于行锁的一种情况
间隙的意思就是between中的数据
在主键索引id中有多个数据未填充,这个时候如果两个线程A和B,A在查询0-10之间的数据,而B在往id=3插入数据,就会造成数据脏读的问题
所以在进行between等范围查找的是事务时候,会加间隙锁进行约束
临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。
(临就是相邻的意思)
概念 | 乐观锁 | 悲观锁 |
---|---|---|
概念 | 假定不会发生并发冲突 只在提交时判断下是否有数据问题 |
假定会发生并发冲突 从而上锁 |
实现层面 | 业务代码层面,自己实现 (需要结合具体业务逻辑) |
mysql数据库自身实现 |
并发情况 | 并发大 | 并发小 |
实现方式 | 在数据库中增加版本号字段, 提交时判断操作前的版本号和当前版本号是否一致 |
共享锁:select lock xxxxxx 排它锁:select xxxx for update |
其他 | mysql中的synchronized其实就是排它锁 共享锁:运行其他线程查不允许增删改 排它锁:增删改都不允许 |
到此这篇关于mysql中锁机制的文章就介绍到这了,更多相关mysql锁机制内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界!
请发表评论