Hello!欢迎各位新老朋友来看小弟博客,祝大家事业顺利,财源广进!!
一:什么是幻读,脏读,不可重复读呢?
事务 A、B 交替执行,事务 A 被事务 B 干扰到了,因为事务 A 读取到事务 B 未提交的数据,这就是脏读
在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。
事务 A 查询一个范围的结果集,另一个并发事务 B 往这个范围中插入/删除了数据,并静悄悄地提交,然后事务 A 再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。
二:在高并发情况下,如何做到安全的修改同一行数据?
要安全的修改同一行数据,就要保证一个线程在修改时其它线程无法更新这行记录。一般有悲观锁和乐观锁两种方案~
使用悲观锁
悲观锁思想就是,当前线程要进来修改数据时,别的线程都得拒之门外~ 比如,可以使用 select…for update ~
select * from User where name=‘jay’ for update
以上这条 sql 语句会锁定了 User 表中所有符合检索条件(name=‘jay’)的记录。本次事务提交之前,别的线程都无法修改这些记录。
使用乐观锁
乐观锁思想就是,有线程过来,先放过去修改,如果看到别的线程没修改过,就可以修改成功,如果别的线程修改过,就修改失败或者重试。实现方式:乐观锁一般会使用版本号机制或 CAS 算法实现。
三:数据库的乐观锁和悲观锁
悲观锁:
悲观锁她专一且缺乏安全感了,她的心只属于当前事务,每时每刻都担心着它心爱的数据可能被别的事务修改,所以一个事务拥有(获得)悲观锁后,其他任何事务都不能对数据进行修改啦,只能等待锁被释放才可以执行。
乐观锁:
乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。实现方式:乐观锁一般会使用版本号机制或 CAS算法实现。之前转载了的这篇文章,觉得作者写得挺详细的~
四:SQL 优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义
show status 命令了解各种 sql 的执行频率
通过慢查询日志定位那些执行效率较低的 sql 语句
explain 分析低效 sql 的执行计划(这点非常重要,日常开发中用它分析 Sql,会大大降低 Sql 导致的线上事故)
五:select for update 有什么含义,会锁表还是锁行还是其他
select 查询语句是不会加锁的,但是 select for update 除了有查询的作用外,还会加锁呢,而且它是悲观锁哦。至于加了是行锁还是表锁,这就要看是不是用了索引/主键啦。
没用索引/主键的话就是表锁,否则就是是行锁。
select for update 加锁验证
表结构:
id 为主键,select for update 1270070 这条记录时,再开一个事务对该记录更新,发现更新阻塞啦,其实是加锁了。如下图:
我们再开一个事务对另外一条记录 1270071 更新,发现更新成功,因此,如果查询条件用了索引/主键,会加行锁~
我们继续一路向北吧,换普通字段 balance 吧,发现又阻塞了。因此,没用索引/主键的话,select for update 加的就是表锁
好了,朋友们,点点关注不迷路,喜欢的朋友们还请留下您的小赞赞,小弟会更加努力更新!!如果感兴趣的话,欢迎关注小弟公众号 【科技脉搏】!!!🥳🥳🥳