数据库事务中的锁可以按照不同的维度进行分类。以下是一些常见的分类方式:
1、按锁的粒度分类:
- 行锁(Row-level lock):锁定单个或少量的数据行。这种锁粒度小,允许高度的并发,但管理开销大。
- 页锁(Page-level lock):锁定数据库页,即数据文件中存储数据的单位。
- 表锁(Table-level lock):锁定整个表,所有行都被锁定。这种锁粒度大,管理开销小,但并发能力较低。
- 数据库锁(Database-level lock):锁定整个数据库,这通常用于执行数据库维护任务。
2、按锁的类型分类:
- 共享锁(Shared lock):又称为读锁,允许一个事务读取一行数据,其他事务可以同时读取这同一行数据,但不能写入。
- 排他锁(Exclusive lock):又称为写锁,当一个事务对数据加上排他锁时,其他事务既不能读取也不能写入这行数据。
- 意向锁(Intent lock):表明事务打算在表的某些行上加共享锁或排他锁。这是一种表级锁,用于支持行级锁。
3、按操作类型分类:
- DML锁(Data Manipulation Language Lock):用于保护像 INSERT、UPDATE、DELETE 这样的数据操作语句。
- DDL锁(Data Definition Language Lock):用于保护定义或修改结构的操作,如 CREATE TABLE、ALTER TABLE 等。
4、按锁的模式分类:
- 乐观锁:不是通过直接控制数据库的锁机制实现的,而是通过记录版本号或时间戳来判断数据在读取和写入期间是否被其他事务修改过。
- 悲观锁:假设冲突会发生,并通过直接锁定数据来预防冲突。
5、按锁的持有时间分类:
- 即时锁(Instant lock):操作完成后立即释放的锁。
- 长期锁(Long-term lock):在事务结束之前一直持有的锁。
了解这些锁的分类有助于数据库设计和事务管理,可以根据不同的应用场景选择合适的锁策略来平衡系统的性能和并发需求。