gamez-小于或等于号
多用户环境下的数据并发访问及数据一致性简介
在只有单一用户的数据库中,
用户可
以任意修改数据,
而无需考虑同时有其他用
户正在修改相同的数
据。
但在一个多用户数据库中,
多个并发事务中包含的语句
p>
可能
会修改相同的数据。数据库中并发执
行的事务最终应产生有意义且具备一
致性的结果。因此在多用户数据库中,对数据并发访
问(
data
concurrency
)及
数据一致性(
data
consistency
)进行控制是两项极为重要的工作。
1
、数据并发访问指多用户同时访问相同的数据。
2
、数据一致性指系统中每个用户都能够取得具
备一致性的数据,同时还能够看
到自己或其他用户所提交的事务对数据的修改。
为了描述同时执行的多个事务如何实现数据一致性,
数据库研究人员定义了被称
为串行化处理(
seria
lizability
)的事务隔离模型(
transacti
on isolation
model
)。当所有事务都采取
串行化的模式执行时,我们可以认为同一时间只有
一个事务在运行(串行的),而非并发
的。
以串行化模式对事务进行隔离的效果很好,
但在此种模式下应用程序的效率将大
大降低。将并行执行的事务完全隔离意
味着即便当前只存在一个对表进行查询
(
query
)的事务,其他事务也不能再对此表进行插入(
insert
)操作了。总之,
为了满足实际要求,
我们需要在事
务的隔离程度与应用的性能之间找出一个平衡
点。
Oracle
支持两种事务隔离级别(
isolation
level
),使应用程序开发者在对事
务进行控制时
,既能保证数据的一致性,又能获得良好的性能。
需要防止的现象和事务隔离级别
ANSI/ISO
SQL
标准
p>
(
SQL92
)
定
义了四种事务隔离级别
(
transaction
isolation
level
),
这四种隔离级别所能提供的事务处理能力各不相同。这些事务隔离级
别是针对三种现象定
义的,在并发事务执行时,需要阻止这三种现象
中的一种
或多种发生。
三种需要阻止的现象(
preventable
phenomena
)是:
1
、脏读取(
dirty
read
):一个事务读取了被其他事务写入但还未提交的数据。
2
、不可重复读取(
nonrepeatable read
):一个事务再次读取其之前曾经读取
过的数据时,发现数据已被其他已提交的事务修改或删除。
3
、不存在读取(
phantom r
ead
):事务按照之前的条件重新查询时,返回的结
果集中包
含其他已提交事务插入的满足条件的新数据。
SQL92
标准中定义了四个隔离级别,
在各隔离级别中,
允许发生上述三种需要阻
止的现象中的一种或多种。详情见下表
现象
隔离级别
脏读取
不可重复读取
允许
不存在读取
允许
未提交读取(
read
uncommitted
)
允许
已提交读取(
read
不允许
committed
)
可重复读取
不允许
(
repeatable
read
)
串行化
不允许
(
rerializable
)
允许
允许
不允许
允许
不允许
不允许
Oracle
支持三种事务隔离级别:
已提交读取,
串行化,<
/p>
以及
SQL92
中没有包含
的只读模式(
read-
only
mode
)。已提交读取是
Oracle
默认使用的事务隔离级
别。
Oracle
如何管理数据并发访问及数据一致性
Oracle
利用多版本一致性模型(
multiversion
consistency model
),各种类
型的锁及事务
来管理多用户系统中的数据一致性(
data
consistency
)。
多版本并发访问控制
Oracle
能够自动地实现一个查询的读一致性,即一个查询所获得的数据来自同
< br>一时间点(
single point in time
)(这也被称为语句级读一致性
(
statement-
level read
consistency
))。
Oracle
还能令一个事务内的所有
查询都具备读一致性(即事务级读一致性(
transaction-level read
consistency
))。
Oracle
利用回滚段中的信息生成一个能保证一致性的数
据视图。回滚段内保存
了未提交或最近提交的事务中所修改数据的原值。
下图展示了
Oracle
如何利用
回滚段实现语句级的读一致性。
在查询开始执行时,
将记录当前的系统变化编号
(
system
change
number
,
SCN
)
。
在
图
中,
记录的系统变化编号为
1002
3
。
当查询进行扫描时,
只会使用有效
的
(
observed
)数据块。如果
某个数据块内的数据被修改过(即数据块的
SCN
晚
于查询开始执行时记录的
SCN
)
,
Oracle
将使用回滚段中的信息重建此数据块,
并以重建的数据块替代被修改的数据
块供查询使用。
因此,
查询的结果集只包含
查询开始执行时就已经提交的数据。
在查询执行时,
其他事
务修改的数据对此查
询来说是无效的,这保证了每个查询都能得到满足一致性的数据。<
/p>
语句级读一致性
Oracle
强制实现语句级读一致性(
statement-level
read consistency
)。这
保证了单一查询的结
果集来自一个时间点——即查询开始执行的时间。
因此,
一
p>
个查询的结果集永远不会包含脏数据及此查询执行时其他事务提交的数据。
< br>在一
个查询执行期间,
只有在查询执行前提交的数据对此
查询才是可见的。
查询无法
看到其开始执行后提交的数据。
p>
任何一个查询都能得到满足一致性的结果集,
< br>这保证了用户无需额外操作就能确
保数据一致性。
SELECT
,使用子查询的
INSERT
,及包含显式或隐式查询的
UPDATE
或
DELETE <
/p>
语句,都能够保证数据一致性。上述语句通过一个查询
(
query
)来得到她们所需的满足一致性的结果集(分别使用
SELECT
,
INSERT
,
UPDATE
或
DELETE
语句)。
SELECT
语句是一个显式地查询,且其中可以包含嵌套查
询(
nested query
)或
连
接操作
(
join
operatio
n
)
。
INSERT
语句中也能够使用嵌套查询。
UPDATE
及
DELETE
语句能够利用
WHERE
子句或子
查询进行限制,
只操作数据表内的部分数
据行。
INSERT
,
UPDATE
,及
DELETE
语句中包含的查
询能够获得一致性的结果集。
这些查询无法看到其所在
DML
语句对数据的修改。换句话说,这些查询只能看
到其所在
DML
语句开始之前的数据。
TIPS
:如果
SELECT
列表中存在
PL/SQL
函数,那么函数中包含的
SQL
语句将
遵从其自身的语句级读一致性,
而非其所在
SQL
的读一致性。
例如,
SELECT
语
句中的某个函数访问的表可能会在语句执行时被其他事务修改并提交。
此函数每
p>
次执行时都将建立一个新的一致性视图(
snapshot
)。
事务一致性读
Oracle
还能够实现事务级读一致性(
transaction-
level
read
consistency
)。
当一个事务运行在串行化模式(
seriali
zable mode
)下时,则事务内所有数据
访问均反映的
是事务开始时的数据状态。
即事务内的所有查询对某个时间点来说
具备一致性,
但是运行在串行化模式下的事务能够看到事务自身对数据所作的修
改。事务级的读一致性能够保证可重复读取并可阻止出现不存在读取。
RAC
环境下的读一致性
RAC
系统采用缓存对缓存
(
cache-
to-cache
)
的数据块传输机制
(此技术被称为
Cache
Fus
ion
)在实例间传输满足读一致性(
read-
consistent
)的数据块镜像。
RAC
系统通过高速度低延迟的内部连接
(
interco
nnect
)
实现上述数据传输,
从<
/p>
而满足实例之间对数据块的请求。
Oracle
事务隔离级别
Oracle
支持以下三种事务隔离级别(
transaction
isolation level
)。
隔离级别
描述
Oracle
默认使用的事务隔离级别。事务内执行的查询
只能看到查询执行前(而非事务
开始前)就已经提交
的数据。
Oracle
< br>的查询永远不会读取脏数据(未提交
的数据)。
Oracle
不会阻止一个事务修
改另一事务中的查询正
在访问的数据,因此在一个事务内的两个查询的执行
间歇期间,数据有可能被其他事务修改。举例来说,
如果一个事务内同一查询
执行两次,可能会遇到不可
重复读取或不存在读取的现象。
串行化隔离的事务只能看到事务
执行前就已经提交的
数据,
以及事务内
INSERT
,
UPDATE
,
及
DELETE
语
句对数据的修改。串行化隔离的事务不会出现不可重
复读取或不存在读取的现象。
已提交读取
串行化
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
gamez-小于或等于号
-
上一篇:大学英语四级听力预测题(一)及答案
下一篇:四级听力模拟