数据库是一个共享资源,可以提供多个用户使用。这些用户程序可以一个一个地串行执行,
每个时刻只有一个用户程序运行,
执行对数据库的存取,
其他用户程序必须等到这个用户程
序结束以后方能对数据库存取。但是如果一个用户程序涉及大量数据的输入
/
输出交换,则
数据库系统的大部分时间处于闲置状态。
因此,
为了充分利用数据库资源,
发挥数据库共享
资源的特点,
应该允许多个用户并行地存取数据库。
但这样就会产生多个用户程序并发存取
同一数据的情况,
若对并发操作不加控制就可能会存取和存储不正确的数据,
破坏数据库的
一致性,
所以数据库管理系统必须提供并发控制机制。
并发控制机制的好坏是衡量一个数据
库管理系统性能的重要标志之一。
DM
用封锁机制来解决并发问题。它可以保证任何时候都可以有多个正在运行的用户程序,
但是所有用户程序都在彼此完全隔离的环境中运行。
一、
并发控制的预备知识
(
一
)
并发控制概述
并发控制是以事务(
transaction
)为单位进行的。
1.
并发控制的单位
――
事务
事务是数据库的逻辑工作单位,它是用户定义的一组操作序列。一个事务可以是一组
SQL
语句、一条
SQL
语句或整个程序。
事务的开始和结束都可以由用户显示的控制,
如果用户没有显式地定义事务,
则由数据库系
统按缺省规定自动划分事务。
事务应该具有
4
种属性:原子性、一致性、隔离性和持久性。
(
1
)原子性
事务的原子性保证事务包含的一组更新操作是原子不可分的,也就是说这些操作是一个整
体,
对数据库而言全做或者全不做,
不能部分的完成。
这一性质即使在系统崩溃之后仍能得
到保证,
在系统崩溃之后将进行数据库恢复,
用来恢复和撤销系统崩溃处于活动状态的事务
对数据库的影响,
从而保证事务的原子性。
系统对磁盘上的任何实际数据的修改之前都会将
修改操作信息本身的信息记录到磁盘上。
当发生崩溃时,
系统能根据这些操作记录当时该事
务处于何种状态,
以此确定是撤销该事务所做出的所有修改操作,
还是将修改的操作重新执
行。
(
2
)一致性
一致性要求事务执行完成后,
将数据库从一个一致状态转变到另一个一致状态。
它是一种以
一致性规则为基础的逻辑属性,
例如在转账的操作中,
各账户金额必须平衡,
这一条规则对
于程序员而言是一个强制的规定,
由此可见,
一致性与原子性是密切相关的。
事务的一致性
属性要求事务在并发执行的情况下事务的一致性仍然满足。
它在逻辑上不是独立的,
它由事
务的隔离性来表示。
(
3
)
隔离性
隔离性意味着一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用的数据对
并发的其他事务是隔离的,
并发执行的各个事务之间不能互相干扰。
它要求即使有多个事务
并发执行,看上去每个成功事务按串行调度执行一样。这一性质的另一种称法为可串行性,
也就是说系统允许的任何交错操作调度等价于一个串行调度。
串行调度的意思是每次调度一
个事务,在一个事务的所有操作没有结束之前,另外的事务操作不能开始。由于性能原因,
我们需要进行交错操作的调度,
但我们也希望这些交错操作的调度的效果和某一个串行调度
是一致的。
DM
实现该机制是通过对事务的数据访问对象加适当的锁,从而排斥其他的事
务对同一数据库对象的并发操作。
(
4
)持久性
系统提供的持久性保证要求一旦事务提交,
那么对数据库所做的修改将是持久的,
无论发生
何种机器和系统故障都不应该对其有任何影响。例如,自动柜员机(
ATM
)在向客户支付
一笔钱时,
就不用担心丢失客户的取款记录。
事务的持久性保证事务对数据库的影响是持久
的,即使系统崩溃。正如在讲原子性时所提到的那样,系统通过做记录来提供这一保证。
DM
没有提供显式定义事务开始的语句,第一个可执行的
SQL
语句
(
除
CONNECT
语句外
)
隐含事务的开始,
但事务的结束可以由用户显式的控制。
在
DM
中以下几种情况都结束
(
正
常,非正常
)
某一事务:
(
1
)当某一连接的属性设置为自动提交,每执行一条语句都会提交;
(
2
)遇到
COMMIT/ROLLBACK
语句,便提交
/
回滚一事务;
(
3
)当系统的
DDL
自动提交开关打开时(缺省为打开),遇到
DDL
语句则自动提交该
DDL
语句和以前的
DML
和
DDL
操作;
(
4
)事务所在的程序正常结束和用户退出;
(
5
)系统非正常终止时;
说明:
DM
在配置文件中提供了
DDL
语句的自动提交开关
DDL_AUTO_COMMIT
。
当此配
置项的值为
1
(缺省情况)时,所有
DDL
语句自动提交;当此配置项的值为
0
时,除
CREATEDATABASE
、
ALTERDATABASE
和
CREATESCHEMA
语句外的所有
DDL
语句
都不自动提交。
DM
中的一致性是以事务为基础的。
DM
通过提交和回滚分别用于将对数据库的修改永久化
和废除,但是无论是提交和回滚,
DM
保证数据库在每个事务开始前、结束后是一致的。为
了提高事务管理的灵活性,
DM
提供了设置保存点(
SAVEPOINT
)语句和回滚到保存点语
句。
保存点提供了一种灵活的回滚,
事务在执行中可以回滚到某个保存点,
在该保存点以前
的操作有效,而以后的操作被回滚掉。
DM
中的事务同样具有上述
4
个属性:原子性、一致性、隔离性和持久性。
2.
并发操作与数据的不一致性
如果没有锁定且多个用户同时访问一个数据库,
则当他们的事务同时使用相同的数据时可能
会发生问题,导致数据库中的数据的不一致性。
一个最常见的并发操作的例子是火车
/
飞机订票系统中的订票操作。例如,在该系统中的一
个活动序列:
①
甲售票员读出某航班的机票张数余额
A
,设
A=16
;
②
乙售票员读出同一航班的机票张数余额
A
,也是
16
;
③
甲售票员卖出一张机票,修改机票张数余额
A=A-1=15,
把
A
写回数据库;