MySQL——锁和事务隔离级别和MVCC原理

1.锁定义

锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

2.锁分类

  • 从性能上分为乐观锁(用版本对比来实现)和悲观锁。
  • 从对数据库操作的类型分为读锁和写锁(都属于悲观锁。
  • 从对数据操作的粒度分为表锁和行锁。

2.1.表锁(MyISAM存储引擎特有)

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,
并发度最低

  • 手动添加表锁:lock table 表名称 read(write),表名称2 read(write);
  • 查看表上加过的锁:show open tables
  • 删除表锁:unlock tables

2.1.1读锁和写锁的特点

读锁:不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
**写锁:只有当前进程可以对加写锁的表进行增删改查,会阻塞其他进程对该表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

2.1.行锁(InnoDB存储引擎特有)**

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高.
其特点是:一个会话开启事务更新不提交,另一个会话更新同一条记录会阻塞,更新不同记录不会阻塞

3.事务

3.1.事务四大隔离级别

  1. 未提交读
  2. 读已提交
  3. 可重复读
  4. 串行化

注意:MySQL默认的隔离级别是可重复度,Oracle默认隔离级别是读已提交

3.2.并发下可能出现的问题

  1. 脏读
  2. 幻读
  3. 不可重复度

解决这些问题的方法就是合理的选择事务隔离级别。
MySQL——锁和事务隔离级别和MVCC原理_第1张图片

3.MVCC

MVCC翻译成中文就是多版本并发控制器,读已提交和可重复读都是基于它实现的。

1.MVCC实现读已提交和可重复读的原理

  1. 以InnoDB为存储引擎的表都会多一个记录事务id的列,这里简称为trx_id。

  2. 在事务中每进行一次select操作,mysql都会为此当前事务生成一个ReadView对象,该对象有四个关键值:
    MySQL——锁和事务隔离级别和MVCC原理_第2张图片

  3. 在ReadView对象生成之后,会对各行数据的trx_id进行比较,比较规则如下:
    MySQL——锁和事务隔离级别和MVCC原理_第3张图片

  4. 只有满足上述条件的行才会被当前事务的select操作查出来。

  5. 读已提交无法解决幻读的原因是因为每次select时就会新建一个ReadView对象并使用该对象的值去查询,所以可以查到在此事务之后的事务新增的行了,从而出现幻读,而可重复读可以解决幻读是因为它在事务中进行的所以select都是使用第一次select生成的ReadView对象的值作为过滤条件的,所以达到在事务里多次执行相同的select得到的数据是一样的。

你可能感兴趣的:(mysql,数据库,database)