数据库锁

361 阅读2分钟

数据库锁的分类

以下描述均为最简描述,并且可能不全

按锁的粒度

表级锁

如MyISAM引擎,只支持表级锁

行级锁

InnoDB引擎,默认为行级锁,也可支持表级锁

页级锁

介于行级锁与表级锁中间

按锁的级别

共享锁

例如一般的读锁,多个会话同时查询并不会阻塞

排它锁

例如一般的写锁,会阻塞后续的读写操作

按加锁方式

自动锁

数据库自动加的锁,比如MyISAM写操作时的表锁

显式锁

手动显式创建的锁,如select xxx where xxxx lock with share mode

按操作

DML锁

操作表数据时的锁

DDL锁

操作表结构时的锁

使用方式

乐观锁

比较乐观,觉得不会有数据冲突,在数据提交的时候才会对数据冲突与否进行检测,一般实现例如增加版本号字段

悲观锁

对数据修改持保守态度,全程用排它锁锁定。

数据库事务

四大特性

详细解释移步 [IBM] MySQL 事务隔离级别和锁 ACID

  • 原子性(Atomic)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

隔离级别

详细解释移步 [IBM] MySQL 事务隔离级别和锁

READ UNCOMMITTED(读未提交)

该隔离级别的事务会读到其它未提交事务的数据,会引发脏读

READ COMMITTED(读提交)

Oracle 和 SQL Server 的默认隔离级别

一个事务可以读取另一个已提交的事务,一次事务中多次读取可能会造成不一样的结果,此现象称为不可重复读问题。

REPEATABLE READ(可重复读)

MySQL 默认的隔离级别

在同一个事务里, select 的结果是事务开始时时间点的状态,因此,同样的 select 操作读到的结果会是一致的,但是,会有幻读现象

SERIALIZABLE(序列化)

在该隔离级别下事务都是串行顺序执行的

隔离级别脏读不可重复读幻读
读未提交可以出现可以出现可以出现
读提交不允许出现可以出现可以出现
可重复读不允许出现不允许出现可以出现
序列化不允许出现不允许出现不允许出现