事务处理-同步与调度-两阶段锁-隔离级别

第十二章 事务处理

1. 事务定义
  • 事务(Transaction, TXN):是一系列读或写操作的序列,反映了一个真实世界中的单一转换。
2. 事务分组目标

将用户操作(读和写)分组为事务有助于实现两个目标:

  • 恢复与持久性(Recovery & Durability):在面对崩溃、中止、系统关闭等情况下,保持数据库管理系统(DBMS)数据的一致性和持久性。
  • 并发性(Concurrency):通过并行化事务来提高性能,同时不产生异常。
3. 事务属性

事务具有以下四个主要属性,通常称为ACID属性:

  • 原子性(Atomicity):事务是一个不可分割的工作单元,所有操作要么全部完成,要么全部不完成。如果事务执行过程中发生错误,系统会回滚到事务开始前的状态。
  • 一致性(Consistency):事务执行前后,数据库必须处于一致状态,满足所有预定义的约束条件。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的操作不应影响其他事务的结果。
  • 持久性(Durability):一旦事务提交,其对数据库的更改就是永久性的,即使系统发生故障也不会丢失这些更改。

同步与调度

1. 并发性
  • 并发性:涉及隔离性和一致性。在多事务并发执行的场景中,确保每个事务看到的数据是一致的,如同在单独环境中执行。
2. 调度类型
  • 串行调度(Serial Schedule):不交错不同事务的操作。
  • 可串行化调度(Serializable Schedule):等价于某些串行执行的调度。
3. 冲突定义

两个操作如果属于不同的事务、涉及相同的变量,并且至少有一个是写操作,则它们是冲突的。具体包括:

  • 读-写冲突(RW)
  • 写-读冲突(WR)
  • 写-写冲突(WW)

总结

本章节详细介绍了事务处理的基本概念、目标、属性以及同步与调度的相关内容。理解这些知识点对于确保数据库操作的可靠性和完整性至关重要。

同步与调度

1. 交错执行的异常
  • 不可重复读:在事务执行期间,对同一数据的多次读取结果不一致。
  • 脏读/读取未提交数据:读取到其他事务未提交的数据,这些数据可能会被回滚。
  • 不一致读/读取部分提交:读取到部分提交的数据,导致数据不一致。
  • 部分丢失更新:由于并发操作,某些更新操作被覆盖,导致数据丢失。
2. 调度的可串行化
  • 冲突可串行化:如果一个调度S在冲突上等价于某个串行调度,则称S为冲突可串行化。这可以通过检查冲突图是否为无环图(acyclic)来确定。

两阶段锁(Two-Phase Locking, 2PL)

1. 锁定调度器 vs. 多版本并发控制
  • X锁(排他锁):在写入对象前加锁,确保写入时的独占性。
  • S锁(共享锁):在读取对象前加锁,允许多个事务同时读取。
2. 细粒度锁
  • 示例:在元组级别加锁,如SQL Server。高并发性,但管理开销大。
3. 粗粒度锁
  • 示例:在表或整个数据库级别加锁,如SQLite。假冲突多,管理开销小。
4. 两阶段锁的阶段
  • 增长阶段:事务获取所有需要的锁。
  • 收缩阶段:事务释放已获取的锁。在Strict 2PL中,锁只在COMMIT或ABORT时释放。
5. 死锁
  • 定义:多个事务循环等待对方释放锁,导致所有相关事务无法继续执行。
  • 检测:使用等待图(Waits-for graph)来检测死锁。如果图中存在环,则存在死锁。
6. 不同厂商的主要差异
  • SQLite:在整个数据库上加锁,只有一个排他锁,因此不会发生死锁。
  • SQL Server、DB2等:在单个记录上加锁,并定期检查死锁并在事务上执行回滚操作。

总结

本章节详细介绍了同步与调度中的常见异常、调度的可串行化条件、两阶段锁的工作机制及其不同实现方式,以及死锁的定义和检测方法。理解这些知识点对于设计和优化数据库系统的并发控制策略至关重要。

隔离级别(Isolation Levels)

1. 隔离级别与并发异常
  • 脏读(Dirty Reads):读取到其他事务未提交的数据。
  • 不可重复读(Nonrepeatable Reads):同一个事务中对同一数据的多次读取结果不一致。
  • 幻读(Phantoms):同一个事务中,执行相同的查询,但结果集不同(有新的数据插入或删除)。
2. 隔离级别及解决的并发异常
  • Read Uncommitted:允许脏读、不可重复读和幻读。
  • Read Committed:避免脏读,但允许不可重复读和幻读。
  • Repeatable Read:避免脏读和不可重复读,但允许幻读。
  • Serializable:避免脏读、不可重复读和幻读,提供最严格的隔离。
3. 隔离级别的实现
  • Read Uncommitted
    • 写锁:在Strict 2PL下,写操作使用长时长的排他锁。
    • 读锁:不使用读锁,读操作不会被阻塞。
  • Read Committed
    • 写锁:在Strict 2PL下,写操作使用长时长的排他锁。
    • 读锁:使用短时长的共享锁,读操作完成后立即释放。
  • Repeatable Read
    • 写锁:在Strict 2PL下,写操作使用长时长的排他锁。
    • 读锁:在Strict 2PL下,读操作使用长时长的共享锁,事务结束后才释放。
  • Serializable
    • 写锁:在Strict 2PL下,写操作使用长时长的排他锁。
    • 读锁:在Strict 2PL下,读操作使用长时长的共享锁,事务结束后才释放。
    • 谓词锁:用于处理幻读,锁定满足条件的记录范围。

Write - Ahead Logging(WAL)

  • 算法:对于每条记录的更新,先将更新记录写入日志(LOG)。
  • 日志刷新规则
    • 规则1:在对应的数据页写入存储之前,先将更新记录刷新到日志。这保证了数据的持久性(Durability)。
    • 规则2:在事务提交之前,将所有更新记录和提交记录刷新到日志。这保证了事务的原子性(Atomicity)。
  • 事务提交:一旦提交记录写入稳定存储,事务就被认为是已提交的。
相关推荐
小罗和阿泽16 小时前
MySql数据库系列 数据库基础操作
数据库·mysql
周末吃鱼16 小时前
mysql8.0支持CURRENT_DATE如何写
数据库·sql·mysql
kaico201816 小时前
MySQL的窗口函数
数据库·mysql
MM_MS16 小时前
Halcon控制语句
java·大数据·前端·数据库·人工智能·算法·视觉检测
薛定谔的猫198216 小时前
LlamaIndex(三) LlamaHub工具集
数据库·mysql·llamahub
小画家~17 小时前
第四十六: channel 高级使用
java·前端·数据库
晴天¥17 小时前
了解Oracle中的体系结构
数据库
DemonAvenger17 小时前
Redis慢查询分析与优化:性能瓶颈排查实战指南
数据库·redis·性能优化
Li_yizYa17 小时前
Redis-常见数据类型及应用场景
java·数据库·redis