2.mysql锁+事务

myIasm中的锁

在这里插入图片描述

锁的粒度:指的是加锁的范围,表级锁,是对表的所有数据进行加锁,那他的粒度就是所有的数据。行级锁只是对每一行进行加锁,那么一行数据就是它的粒度。

读锁

在这里插入图片描述

解释:写锁可以转换成读锁,而读锁不可以转换为写锁。写锁在任意时刻只会有一个线程进行操作,读锁可以多个线程共享,这时候要切换写锁,线程不知道需要切换谁从而导致线程可能出现阻塞等状态。

开启表级读锁的时候(表不起别名)
对表进行加锁:lock table [表名] read
释放表锁:unlock TABLEs
1.同一个session进行任意表的修改操作会报错,并且除了加锁的表可以查询,其他表都不可以查询。
2.非一个session所有表都可以正常读,但是加锁的表插入需要等待,非加锁的表不需要等待。

同一个session加了读锁修改表数据

在这里插入图片描述
在这里插入图片描述

非一个session加了读锁修改表数据

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

表起别名的时候进行加读锁操作会出现报错,如下图
在这里插入图片描述
如果表是带有别名,那么加锁采用另一种语法
lock table [表明] as [别名] read
select a.* from omp_trashpoint a

读锁总结

在A会话创建tb表的读锁。
1.只能对tb表进行查询,其他表报错。
2.所有表都不可以修改数据。
在B会话中
1.可以对所有表进行查询。
2.修改tb表不会报错,但是需要等待A会话把锁释放,才会修改成功
3.可以插入tb以外的所有表数据
4.可以查询所有表的数据

写锁

开启写锁: lock table [表名] write
有哦A和B两个会话。A会话开启了tb表的写锁
总结
同一个会话
1.除了tb表的数据可以写入,其他任何修改表的操作都会报错
2.除了tb表可以读数据,其他表都读不了
不同会话
1.B会话可以查询非加锁的数据,加锁的数据查询进入等待
2.B会话可以修改所有非加锁的表数据,加锁的表数据修改进入等待。

总结

在这里插入图片描述

InnoDb中的锁

行锁

在这里插入图片描述

事务

事务的隔离级别

在这里插入图片描述

事务特性

事务并发下带来的问题
1.脏读(未提交读):事务A读取了事务B更新的数据,然后事务B进行了回滚操作,那么A读到的就是脏数据
(现在有一百元,A和B都拿10元后,A发现拿少了,再去拿十元,A认为余下的钱应该还有70元,但是这时候B在A拿钱的时候把钱还回去了,最后余下是80元。)
2.不可重复读(已提交读):数据A多次读取同一个数据,然后B在事务A多次读取的过程中,对数据进行了更改并且提交了,导致数据A多次读取同一个数据时候,读取不到B提交的新数据。
3.幻读:比如系统管理员A将数据库中所有学生的分数分为ABCD四个级别,但是这时候系统管理员B插入一条分数,当系统管理员A改完数据后,发现还有一条没修改过来。
不可重复读与幻读:不可重复读更侧重于修改,幻读侧重于新增或者删除操作。解决不可重复读只需要锁住满足的条件即可,解决幻读需要锁表。

面试中的问题

并发量很大情况下,修改表结构

需求:比如A表一天中每分每秒都有很多并发量,这时候,需要在A表加一个字段,如果直接去修改A表,数据量越大,A修改的过程时间越久,这个过程会导致A进行锁表,一旦锁表其他操作都会被阻塞,会导致大量用户无法访问。有什么好的解决方案。
解决方案:
1.首先创建一个和A表一样的表结构的空表A1
2.然后写个触发器将A表数据同步到A1表中
3.拷贝完成后,立马删除原来的表,将新表改成A表

在这里插入图片描述

什么情况下行锁会升级为表锁

事务隔离级别为可重复读时候,如果有索引的时候(包括主键索引),以索引列为条件更新数据,会存在间隙锁间、行锁、页锁等问题,从而锁一行,如果没有索引时候,更新数据会锁住整张表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值