[1] 1 5 6 9 14 17 [2] 1 3 4 5 [3] 1 6 7 [4] 1 4 5 11 [5] 1 2 3 4 [6] - [7] 1 2 15 [8] - [9] - (跳过) [10] 1 2 3 6 9 [11] 1 2 3 5 6 7 8 sql 语句 e-r 图
关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。例如,学生关系模式在不同的学年,学生关系是不同的。在实际工作中,人们常常把关系模式和关系都笼统地称为关系,这不难从上下文中加以区别,希望读者注意。
数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。
数据库的完整性是指数据的正确性和相容性。
数据的完整性和安全性是两个不同的概念,但是有一定的联系。 前者是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓垃圾进垃圾出 (Garbage In Garbage Out) 所造成的无效操作和错误结果。 后者是保护数据库防止恶意的破坏和非法的存取。 也就是说,安全性措施的防范对象是非法用户的非法操作,完整性措施的防范对象是不合语义的数据。
完整性约束条件是指数据库中的数据应该满足的语义约束条件。
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。例如某工厂的库存管理系统中,要把数量为 Q 的某种零件从仓库 1 移到仓库 2 存放,则可以定义一个事务 T,T 包括两个操作:Q1 = Q1 - Q,Q2 = Q2 + Q,如果 T 非正常终止时只做了第一个操作,则数据库就处于不一致性状态,库存量无缘无故少了 Q。
把对数据的修改写到数据库中和把表示这个修改的日志记录到日志文件中是两个不同的操作。有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。 如果先写了数据库修改,而在运行记录中没有登记这个修改,则以后就无法恢复这个修改了。如果先写日志,但没有修改数据库,在恢复时只不过是多执行一次 UNDO 操作,并不会影响数据库的正确性。所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。
数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。并发控制可以保证事务的一致性和隔离性。
`T_1` | `T_2` | `T_3` | `T_4` |
lock R | - | - | - |
- | lock R | - | - |
- | 等待 | lock R | - |
unlock | 等待 | - | lock R |
- | 等待 | lock R | 等待 |
- | 等待 | - | 等待 |
- | 等待 | unlock | 等待 |
- | 等待 | - | lock R |
- | 等待 | - | - |
`T_1` | `T_2` |
lock `R_1` | - |
- | lock `R_2` |
- | - |
lock `R_2` | - |
等待 | - |
等待 | lock `R_1` |
等待 | 等待 |
可串行化 (Serializable) 的调度是正确的调度。 可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,我们称这种调度策略为可串行化的调度。