一些收藏

高性能Mysql_笔记1(锁 事务 MVCC 存储引擎)

2022-09-25  本文已影响0人  小名源治

1.1并发控制

1.1.1读写锁

读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,而互不干扰。

写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。

加了读锁之后还能加读锁,但是不能加写锁。加了写锁之后什么锁都不能再加了

1.1.2粒度锁(表锁,行锁)

锁粒度的意思是:锁的范围的大小

1.2事务

1.2.1事务

1.2.2隔离级别

四种隔离级别:

事务的自动提交

show variables like 'autocommit' 

on off 
set autocommit=off; 

对数据库的增删改操作默认开启事务,而select不涉及事务

当业务方法涉及到多步增删改操作时,且想要他们保证要成功全成功,但凡有一个操作失败,则整个操作应该全部失败,此时就应该为这个业务方法开启事务管理。

1.2.3死锁

什么是死锁:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。

解决办法:InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚(这是相对比较简单的死锁回滚算法)。

死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。

1.3多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgresQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准。

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

1.4MySQL的存储引擎(InnoDB)

上一篇下一篇

猜你喜欢

热点阅读