2023-05-19 00:26:22
数据库事务是保障数据一致性与可靠性的核心机制,其特性及并发控制策略可通过以下框架系统阐述:
一、事务的四大核心特性(ACID)原子性(Atomicity)
事务作为不可分割的工作单元,必须全部执行或全部回滚。
实现机制:通过日志记录(如Undo日志)实现回滚。若事务执行中断,系统利用日志撤销已执行操作,恢复数据至事务开始前的状态。
一致性(Consistency)
事务执行前后,数据库必须从一个一致性状态转移到另一个一致性状态。
关键点:一致性依赖原子性、隔离性和持久性共同保障。例如,银行转账中,总金额在事务前后需保持不变。
隔离性(Isolation)
多个事务并发执行时,一个事务的操作不应干扰其他事务。
并发问题:
数据丢失:两个事务同时修改同一数据,后提交的操作覆盖前者。
脏读:事务读取到另一未提交事务修改的数据,若后者回滚,则读取到无效数据。
不可重复读:同一事务内多次读取同一数据,因其他事务修改导致结果不一致。
解决方案:通过封锁协议(如两段锁协议)或隔离级别(如读已提交、可重复读)控制并发。
持久性(Durability)
事务一旦提交,对数据的修改永久生效,即使系统故障。
实现机制:通过Redo日志记录修改后的数据,系统重启后重做已提交事务的操作。
并发问题类型
数据丢失:例如,两个事务同时扣减账户余额,导致总金额错误。
脏读:事务A修改数据未提交,事务B读取该数据后A回滚,B基于错误数据操作。
不可重复读:事务A多次读取同一数据,期间事务B修改并提交,导致A读取结果变化。
幻读:事务A按条件查询数据,事务B插入符合条件的新数据,A再次查询时结果集变化。
基于封锁的并发控制
共享锁(S锁):
事务T获得数据项Q的S锁后,可读Q但不可写Q。
适用场景:读操作,允许多个事务同时读取同一数据。
排他锁(X锁):
事务T获得数据项Q的X锁后,可读Q且可写Q。
适用场景:写操作,确保独占访问。
封锁协议:
一级封锁协议:事务修改数据前必须加X锁,直到事务结束释放,防止数据丢失。
二级封锁协议:在一级基础上,读数据前加S锁,读完释放,防止脏读。
三级封锁协议:在二级基础上,读数据时保持S锁直到事务结束,防止不可重复读。
两段锁协议(2PL):事务分为增长阶段(获取锁)和收缩阶段(释放锁),确保可串行化调度。
故障类型
事务内部故障:
预期故障:如事务逻辑错误导致的主动回滚。
非预期故障:如死锁、运算溢出等。
系统故障:硬件故障或软件错误(如操作系统崩溃)导致内存数据丢失。
介质故障:磁盘损坏等外存故障,导致数据永久丢失。
病毒或人为故障:恶意软件或操作错误导致数据破坏。
恢复手段
数据库转储法:
静态转储:在系统无访问时备份,保证数据一致性但影响可用性。
动态转储:在系统运行中备份,需结合日志确保一致性。
日志文件法:
记录事务操作(如开始、修改、提交),用于故障后重做或撤销操作。
检查点技术:定期记录系统状态,减少恢复时需处理的日志量。
恢复方法
事务故障恢复:
反向扫描日志,找到未提交事务的操作,执行Undo撤销修改。
系统故障恢复:
正向扫描日志,重做已提交事务的操作,Undo未提交事务的操作。
介质故障恢复:
使用最近备份恢复数据,结合日志重做备份后的事务。
数据库事务通过ACID特性保障数据可靠性,其中原子性、一致性、隔离性、持久性相互依赖。并发控制通过封锁协议解决数据竞争问题,而故障恢复机制(如转储、日志)确保系统崩溃后数据可恢复。理解这些机制对设计高可用、高一致的数据库系统至关重要。