一、事务 Transaction
1、定义
一个事务是由单个用户或应用程序程序执行的一个动作或一系列动作,
这些动作读取或更新数据库的内容。
事务是数据库上的一个“逻辑工作单元” ‘logical unit of work’
• 每个事务都会在数据库中执行某些操作 Each transaction does something in the database
• 它的任何单独部分都无法实现任何有用或有趣的结果
No part of it alone achieves anything of use or interest
Two main issues to deal with:
(1) Recovery 恢复: Failures of various kinds, such as hardware failures and system crashes
- 数据完整性:事务是数据库操作的基本单位,它们要么全部成功,要么全部失败。当事务失败时(如由于硬件故障或系统崩溃),恢复机制能够确保数据库状态恢复到一致性和完整性状态,从而保护数据的完整性。
- 故障恢复:数据库系统需要能够应对各种故障,包括硬件故障、软件错误、网络问题等。恢复机制通过备份和日志记录等手段,能够在故障发生后恢复数据库到最近的一致状态,从而最小化数据丢失和损坏的风险。
(2) Concurrent 并发: execution of multiple transactions 多个事务的并行执行
- 提高性能:在现代数据库系统中,多个用户或应用程序可能同时访问和修改数据库。并发处理能够允许这些操作同时进行,从而提高系统的吞吐量和响应速度。
- 数据一致性:并发事务可能会相互干扰,导致数据不一致。因此,并发控制机制(如锁、时间戳排序等)是确保多个事务在并发执行时能够正确交互、保持数据一致性的关键。
事务处理关注“恢复”和“并发”这两个问题,
是因为它们直接关系到数据库系统的可靠性和性能。
恢复机制能够保护数据的完整性,确保在故障发生时能够恢复数据库状态;
并发处理能够提高系统的性能,同时保持数据的一致性。
这两个问题的解决对于构建高效、可靠的数据库系统至关重要。
2、ACID特性
(1)原子性(Atomicity)
事务中的所有操作:All or Nothing 要么全部成功,要么全部失败,不会结束在中间某个环节。
(2)一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态,
事务执行前后数据必须保持一致。
(3)隔离性(Isolation)
隔离性确保了一个事务在完全提交之前,其操作对其他事务或查询是不可见的。
数据库系统提供的隔离机制:避免了并发事务之间的干扰,确保了数据的一致性和完整性。
(4)持久性(Durability)
一旦事务被提交,它对数据库的修改就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
3、示例:转账操作

二、并发 Concurrency
1、Why Concurrency?
大型数据库被许多人使用,数据库上需要运行许多事务,最好让它们能够同时运行。
若不允许并发,则事务将按顺序(sequentially)运行,将事务排成队列a queue of transactions,
长时间运行的事务(例如备份backups)将使其他事务长时间等待。
2、优势与功能
系统中允许多个事务并发运行。其优势包括:
(1)提高处理器(processor)和磁盘的利用率(disk utilization),
从而提升事务吞吐量(transaction throughput)
例如,当一个事务正在使用CPU时,另一个事务可以同时从磁盘读取数据或向磁盘写入数据
(2)缩短事务的平均响应时间:短事务无需在长事务之后等待。
3、并发问题
为了并发运行事务,我们交错执行它们的操作
(1)丢失更新 Lost Update
多个事务对同一数据项进行读取和修改操作时,后执行的事务覆盖了先执行事务的更新,
导致先执行事务的更新丢失,最终数据结果不符合预期。
例如:两个事务 T1 和 T2 都读取数据项 X,都修改它,然后都写入。
最终只有 T2 的更改生效,X 的值增加了 5,而不是预期的不变。
数据不一致的原因:因多个事务对同一数据项读写冲突,后写覆盖先写,导致数据不一致。

(2)未提交更新 Uncommitted Update
当一个事务T1对数据项X进行修改并写入时,在未提交的情况下,这个修改后X的状态就成为了一个不稳定的 “伪基准”。
如果事务T1回滚,那么:
其他事务,如T2,如果在此期间(T1已写入数据X但未提交)读取X并基于这个 “伪基准” 进行了修改,就会导致数据不一致。
重点:基于“伪基准”所做的数据项修改,导致数据不一致 (未提交 ——> 伪基准)
数据不一致的原因:因未提交修改被利用,回滚时导致不一致。

(3)不一致分析 Inconsistent Analysis
一个事务T1的多个操作步骤对不同数据项(X和Y)有影响,
其他事务T2在T1的部分操作完成时进行分析,看到了不一致的中间状态,导致分析结果错误,
与事务全部完成后的正确结果不一致。
例如: T1 从 X 取 5 并加到 Y 上,但 T2 只看到了对 X 的操作,导致分析结果不一致。
数据不一致的原因:因事务分步操作,其他事务看到中间不一致状态。

4、调度 Schedules
(1)定义
调度 是 数据库管理系统 对多个并发事务的操作执行顺序的一种安排。
sequence of operations from multiple transactions.
(2)组成
由一组并发事务的操作序列组成。保留了每个单独事务中操作的顺序。
例如,有事务T1执行一些数据库操作(如查询数据、更新数据等),
事务T2也同时执行一些不同的数据库操作,这些操作组合在一起就形成了一个调度。
(3)重要特性
保留操作顺序
对于每个单独的事务,其内部操作的顺序是被保留的。
例如,事务T1可能是先读取某个表中的数据,然后对数据进行修改,最后将修改后的数据写回表中。在调度中,T1的这些操作必须按照这个顺序出现,不能出现先写回数据然后再读取的情况。
其他并发事务如T2、T3等,它们各自的操作顺序在调度中也会被严格遵循。这就保证了每个事务自身逻辑的正确性。
决定并发执行方式
调度决定了这些并发事务的操作是如何在时间上交错执行的。
不同的调度方式会导致不同的结果,有些调度可能会导致并发问题,
而有些合理的调度则可以避免这些问题,确保数据库的一致性和正确性。
例如,通过合理安排事务T1和T2对同一数据项的读和写操作顺序,可以避免数据不一致的情况发生。
(4)调度方式
1.串行调度 Serial schedule
每个事务依次执行,前一个事务完成所有操作并提交后,后一个事务才开始执行。
2.非串行调度 Non-serial Schedule
事务的操作是穿插进行的。
交错调度(Interleaved Schedule)是非串行调度(Non-serial Schedule)的子集。
(5)示例



(6)可串行化 Serialisability
一个非串行调度,如果能产生与某个串行执行相同的结果,则是可串行化的。
A non-serial schedule is serialisable if it produces the same results as some serial execution
目标是找到允许事务并发执行且互不干扰的非串行调度。
(7)冲突可串行化 Conflict Serialisability
如果一个调度中的事务存在冲突,但该调度仍然是可序列化的(即等价于某个串行调度),则称该调度为冲突可序列化。
(8)优先图 / 前驱图 Precedence Graphs
一种用于判断事务调度是否冲突可序列化的工具 To determine if a schedule is conflict serializable
节点 node:在优先图中,每个节点代表一个事务。
有向边 directed edge:
如果事务Ti中的某个操作A1与事务Tj中的某个操作A2存在冲突,并且A1在A2之前发生,
则从Ti 到 Tj 绘制一条有向边Ti → Tj。
冲突操作包括:
读写冲突:一个事务读取另一个事务写入的数据 (包括:先读后写,先写后读)
写写冲突:两个事务尝试写入同一数据
构建优先图
根据给定的事务调度,构建包含所有事务及其冲突关系的优先图。
检测环
检查优先图中是否存在环。contains a cycle = the schedule is not conflict serialisable.
如果存在环,则意味着存在无法避免的冲突,该调度不是冲突可序列化的。
如果图中无环,则可以通过重新排序事务来得到一个冲突可序列化的调度。
示例:


三、事务管理器 The Transaction Manager
事务管理器 确保ACID(原子性、一致性、隔离性、持久性)属性得到执行,
安排事务的操作 It schedules the operations of transactions
1、确保原子性
使用COMMIT 和 ROLLBACK
(1)COMMIT 事务成功结束
事务的更改应保存并对其他事务可见;同时,将内存中的数据更改。写入数据库文件。
(2)ROLLBACK事务不成功结束
事务的更改应撤销,就像事务从未发生过。
2、确保并发事务的一致性和隔离性
锁
锁被用来确保并发事务的一致性和隔离性
Locks are used to ensure consistency and isolation for concurrent transactions
系统会保存日志,以确保在系统发生故障时数据的持久性
四、锁 Locking / Locks
1、定义
锁是数据库中的一种机制,用于处理多个事务间的协同关系。
用于控制对数据并发访问,以确保并发事务的可串行化。
它可以看作是数据库对某些记录或数据表的一种标记,
用于指示资源当前状态是否被某些事务占用。
确保多个事务在访问同一数据时,能够保持数据的一致性和完整性。
为了使用一个资源(如表、行等),事务必须先在该资源上获取锁。
这可能会拒绝其他事务对该资源的访问,以防止产生错误的结果。
2、工作原理
当事务尝试访问 被锁定的资源时,如果无法立即获得锁,它必须等待直到锁被释放。
(1)锁的获取与释放
当事务需要访问某个资源时,会向数据库管理系统请求获取相应的锁:
数据库管理系统会根据 锁的类型和当前资源的状态 来决定是否授予锁。
如果事务成功获取锁,则可以对该资源进行访问或修改。
当事务完成或发生异常时,会释放所持有的锁。Locks are released on commit / rollback.
(2)锁的兼容性
不同类型的锁之间具有不同的兼容性。
共享锁与共享锁之间兼容,即多个事务可以同时持有对同一资源的共享锁。
排他锁与任何类型的锁都不兼容,即一个事务持有对某资源的排他锁时,其他事务无法获得该资源的任何锁。
(3)死锁与死锁检测
死锁是指两个或多个事务互相等待对方释放锁的情况,导致系统无法继续执行。
MySQL数据库管理系统会定期检测死锁情况,并采取相应措施(如回滚其中一个事务)来解除死锁。
3、类型
(1)共享锁 / 读锁
(Shared lock 或 S - lock 或 read - lock )
允许多个事务同时读取一个资源,但不允许任何事务同时更改它。
(2)排他锁 / 写锁
(Exclusive lock 或 X - lock 或 write - lock)
允许一个事务独占写入一个资源,同时不允许其他事务读取该资源。
4、事务获取锁的限制
5、两阶段锁协议 Two - Phase Locking (2PL) Protocol
两阶段封锁协议(2PL)要求事务在执行过程中,所有的加锁操作必须发生在解锁操作之前。
事务被明确地分为两个阶段:
(1)增长阶段 Growing Phase
Only locks are acquired in this phase
在这个阶段,事务可以根据需要获取对所需资源的锁(读锁 / 写锁)
在这个阶段,事务不能释放任何已经获得的锁。
(2)缩减阶段 Shrinking Phase
Only locks are released in this phase
一旦事务进入缩减阶段,它就不能再获取新的锁了。
在这个阶段,事务只能释放之前获得的锁。
当事务提交或回滚时,它会释放所有持有的锁。
示例:

6、可串行性定理 Serialisability Theorem
是数据库事务处理中的一个重要定理,它关于两阶段事务(Two-Phased Transactions)的调度是否冲突可串行化。以下是对这一知识点的详细讲解:
(1)前提
1.可串行性(Serialisability)
如果一个事务的并发执行结果与某个串行执行(即事务一个接一个地按顺序执行)的结果相同,
则称这些并发事务是可串行化的。
2.两阶段事务(Two-Phased Transactions)
事务被明确地分为两个阶段:增长阶段(Growing Phase)和缩减阶段(Shrinking Phase)。
在增长阶段,事务只能获取锁,不能释放锁;在缩减阶段,事务只能释放锁,不能获取新锁。
3.冲突(Conflict)
两个事务之间的冲突 通常指的是它们试图同时访问或修改同一数据资源,而其中一个事务的操作被另一个事务的操作所阻碍或影响。
(2)内容
可串行性定理指出:Any schedule transactions that adhere to the two-phase locking protocol is conflict serialisable
任何遵循两阶段封锁协议的事务调度都是冲突可串行化的。
如果一个数据库系统采用了两阶段封锁协议来管理事务的锁操作,
那么在这个系统中执行的任何事务调度都可以通过某种方式重新排列(即串行化),
使得它们的行为与某个串行执行的事务序列产生的结果相同。
(3)效果
1.避免丢失更新

在两阶段锁协议下,事务在扩展阶段必须锁定所有需要访问的数据项,并且直到收缩阶段才能释放这些锁。
因此其他事务在第一个事务完成之前无法访问或修改这些数据项。
这意味着,当两个事务并发地尝试更新同一数据项时,它们会按照某种顺序获得锁,并且后一个事务必须等待前一个事务完成(即释放锁)后才能继续执行。
因此,后一个事务的更新不会覆盖前一个事务的更新,从而避免了丢失更新的问题。
2. 避免未提交更新

由于两阶段锁协议确保了事务在提交前不会释放锁,因此其他事务无法读取到未提交的更改。
其他事务无法基于未提交的更改做出决策或进一步的操作,有效地防止了未提交更新的发生。
3. 避免不一致分析

五、死锁 Deadlocks
1、定义
当两个或更多事务 等待对方持有的锁被释放时 可能导致的僵局。
例如 T1 持有 X 的锁并等待 Y 的锁,T2 持有 Y 的锁并等待 X 的锁。
2、检测
可以通过等待图(Wait - For Graphs, WFG)来检测死锁:当等待图包含环时,死锁存在。
3、创建等待图
step1. 每个事务被表示为一个顶点(节点)Each transaction is a vertex
step2. 如果事务Ta正在等待锁定一个当前被事务Tb锁定的项,
则从Ta到Tb绘制一条有向边(弧)
Arcs from Ta to Tb if Ta is waiting to lock an item that is currently locked by Tb
step3. 当且仅当等待图(WFG)中包含一个环时,才存在死锁
Deadlock exists if and only if the WFG contains a circle.
六、优先图和等待图的使用示例
1、优先图Precedence Graph:判断一个调度是否是冲突可串行化的 conflict serialisable?
(冲突可序列化:虽然一个调度中的事务存在冲突,但该调度仍然是可序列化的,即等价于某个串行调度)
如果存在环,则意味着存在无法避免的冲突,该调度不是冲突可序列化的。
如果图中无环,则可以通过重新排序事务来得到一个冲突可序列化的调度。
2、等待图Wait-for Graph:检测是否存在死锁
(死锁:两个或更多事务 等待对方持有的锁被释放)
如果存在环,则意味着死锁存在。








488

被折叠的 条评论
为什么被折叠?



