有人说区块链是万能的,也有人说是炒概念骗人
|
for update排它写锁: 为了让自己查到的数据确保是最新数据,并且查到后的数据只允许自己来修改的时候,需要用到for update。相当于一个 update 语句。在业务繁忙的情况下,如果事务没有及时的commit或者rollback 可能会造成其他事务长时间的等待,从而影响数据库的并发使用效率。 Gap Lock间隙锁: 1、行锁只能锁住行,如果在记录之间的间隙插入数据就无法解决了,因此MySQL引入了间隙锁(Gap Lock)。间隙锁是左右开区间。间隙锁之间不会冲突。 2、间隙锁和行锁合称NextKeyLock,每个NextKeyLock是前开后闭区间。 间隙锁加锁原则(学完忘那种): 1、加锁的基本单位是 NextKeyLock,是前开后闭区间。 2、查找过程中访问到的对象才会加锁。 3、索引上的等值查询,给唯一索引加锁的时候,NextKeyLock退化为行锁。 4、索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,NextKeyLock退化为间隙锁。 5、唯一索引上的范围查询会访问到不满足条件的第一个值为止。 6、MVCC MVCC: 1、全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的理念,维持一个数据的多个版本,使得读写操作没有冲突。 2、MVCC在MySQL InnoDB中实现目的主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 MySQL InnoDB下的当前读和快照读 当前读 1、像select lock in share mode(共享锁)、select for update 、update、insert、delete(排他锁)这些操作都是一种当前读,就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。 2、当前读可以认为是悲观锁的具体功能实现 快照读 1、不加锁的select就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。 2、快照读就是MVCC思想在MySQL的具体非阻塞读功能实现,MVCC的目的就是为了实现读-写冲突不加锁,提高并发读写性能,而这个读指的就是快照读。 3、快照读就是MySQL为我们实现MVCC理想模型的其中一个具体非阻塞读功能。 因为大佬不满意只让数据库采用悲观锁这样性能不佳的形式去解决读-写冲突问题,而提出了MVCC,所以我们可以形成两个组合: MVCC + 悲观锁:MVCC解决读写冲突,悲观锁解决写写冲突 MVCC + 乐观锁:MVCC解决读写冲突,乐观锁解决写写冲突 MVCC的实现原理
MVCC实现原理主要是依赖记录中的 四个隐式字段、undo日志 、Consistent Read View来实现的。 (编辑:柳州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


