关系型数据库 --- 锁模块

锁模块

MyISAM 与 Inno DB 关于锁方面的区别是什么?

一、MyISAM 默认用的是表级锁,不支持行级锁。

lock tables 表名 read | write;表上读锁

unlock tables;表解锁

读锁也叫做共享锁

写锁也叫做排他锁

select 语句后面加上 for update 就可以是 排他锁了。

二、Inno DB 默认用的是行级锁,也支持表级锁。

show  variables like 'autocommit';

set autocommit = 0;关闭自动提交,但是仅支持当前session 就是当前窗口的意思。

begin transaction sql 也可以关闭提交。

select sql 后面加上 lock in share mode ;就可以上读锁了

不走索引的时候 整张表都会被锁住

MyISAM 的使用场景

频繁执行全表 count 语句

对数据进行增删改的频率不高,但是对查询非常频繁

没有事务

Inno DB 的使用场景

数据增删改查都相当频繁的场景

可靠性要求比较高,支持事务

数据库锁的分类

一、按锁的粒度划分,可分为表级锁,行级锁,页级锁

二、按锁的级别划分,可分为,共享锁,排它锁

三、按加锁方式划分 ,可分为,显示锁,自动锁

四、按操作划分,可分为,DML锁,DDL锁

五、使用方式来划分,可分为,乐观锁,和悲观锁

锁模块之数据库事务的四大特效?

ACID

原子性 (Atomic)

一致性 (Consistency)

隔离线 (Isolation)

持久性 (Durability)

事务隔离级别以及各级别下的并发访问特性?

关系型数据库 --- 锁模块_第1张图片

一、事务并发访问引起的问题以及如何避免?

1/更新丢失 --- MySQL所有事务隔离级别在数据库层面上均可避免

2/脏读 --- READ-COMMITTED事务隔离级别以上可避免

查看事务的隔离性 

select @@tx_isolation;

设置当前session的事务隔离级别

set session transaction  isolation level read uncommitted;

开启事务

start transaction;

回滚

rollback;

3/不可重复读 --- REPEATABLE-READ 事务隔离级别以上可避免

set session transaction isolation level repeatable read;

4/幻读 --- SERIALIZABLE事务隔离级别可避免

当前读就是加上共享读锁。

set session transaction isolation level serializable;

关系型数据库 --- 锁模块_第2张图片

Inno DB可重复读隔离级别下如何避免幻读?

表象:快照读(非阻塞读) -- 伪 MCC

内在: next -key 锁 (行锁 + gap 锁)

关系型数据库 --- 锁模块_第3张图片

关系型数据库 --- 锁模块_第4张图片

在RR 级别下事务首次调用快照读的地方很关键,创建快照的时机,决定了快照的版本。 

RC RR级别下的Inno DB 的非阻塞读(快照读)如何实现?

数据行里的DB_TRX_ID 、DB_ROLL_PTR、DB_ROW_ID 字段

DB_TRX_ID  最后一次修改事务的ID 

DB_ROLL_PTR 回滚指针

DB_ROW_ID 行号

undo 日志

read view 

锁模块之RR 如何避免幻读

表象、快照读(非阻塞读) --- 伪MVCC 

next-key  锁(行锁 + gap 锁)

行锁

Gap 锁

对主键索引或者唯一索引会用gap锁吗?

如果where 条件全部命中,则不会加Gap锁,只会加记录锁

关系型数据库 --- 锁模块_第5张图片

如果where条件部分命中,或者全部命中,则会加上gap锁。 

Gap锁会用在 非唯一索引,或者不走索引的当前读中。

一、非唯一索引

关系型数据库 --- 锁模块_第6张图片

gap跟主键值在一起效果更精准 

二、不走索引

关系型数据库 --- 锁模块_第7张图片

你可能感兴趣的:(关系型数据库)