在数据库并发控制的背景下,"读‘脏’数据"是并发操作可能引发的一种数据一致性问题。当多个事务并发执行时,可能会遇到数据不一致的情况,如事务T1更新了一个共享数据项C后,虽然因为某些原因取消了修改,但其他事务T2在T1撤销之前已经读到了该未提交的修改值。在示例中,T1将C值改为200后因故回滚,C恢复为100,但T2读到的C仍然是200,这导致T2读取到的数据与数据库实际状态不符,即出现“脏”数据。
并发控制是数据库管理系统(DBMS)的关键组成部分,用于管理多个用户或事务对数据库的并发访问,确保数据的正确性和一致性。它面临的主要问题是并发执行可能导致的数据不一致性,包括丢失修改、不可重复读和读“脏”数据。
1. **丢失修改** (Lost Update): 两个事务T1和T2各自修改同一数据,若其中一个事务提交而另一个事务还未完成,未提交的事务可能会覆盖掉已完成的修改,导致数据丢失。
2. **不可重复读** (Non-repeatable Read): 在同一个事务内,两次读取同一数据可能得到不同的结果,这是因为其他事务在两次读取之间进行了修改。
3. **读‘脏’数据** (Dirty Read): 如前所述,T2读取到的是T1未提交更改的数据,即使这些更改最终被回滚,也会导致数据在事务之间看起来不一致。
并发控制通过各种技术来解决这些问题,如锁定机制(如两段锁协议)来防止多个事务同时修改同一数据,以及使用封锁(Locking)来暂时阻止其他事务对特定数据的访问,直到事务完成。封锁的粒度也是一个关键概念,它决定了锁定范围的大小,粒度越细,控制得越精确,但并发性能可能下降。
例如,11.2封锁部分介绍了如何通过锁定机制来确保数据的一致性。在飞机订票系统的例子中,如果系统采用适当的并发控制策略,例如悲观锁定或乐观锁定,可以避免上述问题,确保每个事务看到的是数据库的一致视图。
数据库并发控制是保证多用户环境下数据完整性和一致性的核心,通过理解并发控制原理,掌握如封锁、活锁与死锁的概念,以及实施有效的并发调度策略,可以帮助设计出更健壮的数据库系统。