数据库管理系统(DataBase Management S有stem,DBMS),是位于用户与操作系统之间的一层数据管理软件,功能主要包括:数据定义,数据操纵,数据库的运行管理,数据库的建立和维护等。
事务模型要解决的问题
事务模型:是电子交易操作的保障。
为什么需要事务处理机制
事务处理机制,就是要保证用户数据操作动作对数据是“安全的”。
事务模型核心的内容:ACID,这个模型可以保证:操作间串行执行,执行中不必担心出错。A:保证了操作(一些有完整逻辑意义的数据读写动作)要么成功要么失败,A和C保证了数据不会因为写操作发生不一致,I保证了在多会话并发读写同一份数据的情况下数据是完全一致(或数据可能不一致但是尚可接受),D保证了被修改的数据能够长久的存储。
事务机制要处理的问题:事务故障,系统故障,介质故障
- 事务内部的故障,一般可以分为预期的和非预期的。预期的事务内部故障是指可以通过数据库的事务处理机制发现的事务内部故障,这是数据库的事务处理机制提供了回滚操作保证了数据免受损害;非预期的事务内部故障如运算溢出,并发事务死锁故障违反了某些完整性约束而导致的故障,数据库系统依然可以通过回滚操作保证数据免受损害,所以回滚操作在事务处理机制中占有很重要的地位,不同的数据库系统对回滚的实现方式也尽不相同。
- 对于系统故障,如在数据库运行过程中,由于硬件故障,数据库软件及操作系统的漏洞,突然停电等,数据库停止运行,所有正在运行的事务以非正常方式终止,需要数据库系统重新启动,这时数据库系统为保证ACID特性,提供了基于REDO/UNDO的恢复机制,可以正确的恢复到系统崩溃前的状态。
- 介质故障也称为硬故障,只要是指数据库在运行过程中,由于磁头碰撞,磁盘损坏,强磁干扰,天灾人祸等情况,使得数据库中数据部分丢失或全部丢失。解决这一类故障,要依赖于备份系统和归档日志,归档的日志,系统运行期间记载的REDO/UNDO日志等日志相关内容。
并发带来的问题:三种常见的读数据异常现象
不同操作对数据的影响:
- 读-读操作:如果同时只存在多个读操作,对于数据自身则没有影响,即读和读操作互不影响数据的一致性,读读操作可以并发执行。
- 读-写操作:如果读写操作都存在,因写在前读在后(如脏读现象),读在前写在后(不可重复读现象),或者读在前写在后然后又读(幻读现象),就可能因数据被写而导致另外一个读操作的会话读到错误的数据。这个操作可以根据动作发生的先后顺序分为读写操作,写读操作。
- 写-写操作:如果同时存在多个写操作,写写操作直接改变了数据在同一时刻的语义,因此写-写操作不被允许被并发执行。
数据异常的现象
-
脏读现象:按照时间顺序,T1事务在t0时刻对row进行了修改,T2事务在t1时刻先读取了被T1时刻修改了的row值,但是T1在t2时刻终止使得对row的修改失效。如果数据库引擎不支持因高并发操作避免数据异常,则T2在t1时刻读到的就是T1修改后的数据,但是这个数据在现实世界中不存在,对于事务T2而言,读取了被回滚掉的数据,即事务T2发生了脏读异常现象。
-
不可重复读现象:事务T1在t0时刻先读取row的旧值,事务T2在t1时刻对row进行了修改,然后提交事务使得修改生效,此时row因更新变为了新值或因删除而不存在。接下来,事务T1在t3时刻再次读取row对象的值但是row的值已经是新值或者不存在了。对于事务T1而言,物是人非,事务T1发生了不可重复读异常现象。
-
幻象现象:事务T1在t0时刻带有特定条件的读取了row对象的数据,事务T2在t1时刻插入新的数据或更新其他旧的数据但满足事务T1的特定条件,新的数据满足与事务T1同样的条件,当事务T1在t3时刻再次以同样的条件读取数据的时候,rows对象的值已经有新的加入的行。对于事务T1而言