文档详情

数据库系统基础教程-第6章-数据库语言SQL(5).ppt

发布:2019-07-31约5.19千字共28页下载文档
文本预览下载声明
只读事务 通常,多个访问同一数据的只读事务可以并行执行,但是多个写同一数据的事务不能并行执行。 例6.43 从例6.40的关系Flights读取数据来判断某个座位是否是空闲的程序。 该程序只读数据不写数据,其并行执行不会对数据库造成永久性伤害; 最坏情况是:客户可能损失掉选择最喜欢位置的机会 只读、读写的设置 SET TRANSACTION READ ONLY SET TRANSACTION READ WRITE 6.6 SQL中的事务 读脏数据 脏数据:未提交事务所写的数据 脏读取:对脏数据的读取 允许明确指定一个给定的事务可以读脏数据 ISOLATION LEVEL READ UNCOMMITED 读脏数据的风险 写数据的事务夭折,脏数据被移走,像不曾存在。如果别的事务读了这个脏数据,并提交对脏数据的计算或使用。 读脏数据有时出问题,有时无关紧要,当读脏数据无关紧要时,允许读脏数据可以避免 DBMS用来预防读脏数据所做的费时的工作 因等待而未去读脏数据造成的并发性的丢失 6.6 SQL中的事务 * 例6.44:以下述步骤进行账户转移 1. 将钱加到账户2 2.检测账户1是否有足够的钱 a) 没有:从账户2减去此金额 (相当于回滚) b) 有:从账户1减去此金额 假设有可能读脏数据,且存在两个事务在同一时刻执行的事务T1和T2: 账户:A1($100) A2 ($200) A3($300) T1 $150? T2 $250? 可能的执行顺序: T2 将$250 加到A3;A3有$550 T1 将$150 加到A2;A2有$350 T2测试,A2有足够金额($350,脏数据);允许转账 T1测试,A1没有足够金额($100);不允许转账 T2:从A2减去$250 A2有$100 结束 T1:从A2减去$150 A2有-$50 结束(T1回滚) * 例6.45:座位选择新方法 1. 发现有效座位,seatStatus=‘occuped’占用。 若无有效座位,结束。 2. 问顾客是否要此座位,若要则提交。 若不要,seatStatus=‘available’,重复步骤1,再选。 * T2只是因读脏数据,失去选喜欢的座位的机会 …… T1 顾客放弃座位1 occ=FALSE T2 发现座位1占用 不能选 T1 occ=TRUE 占用座位1 假设可能读脏数据,且可能的事务执行顺序: 并发操作可能导致三种数据库状态不一致的情况: 脏读:事务读取还未被提交的数据; 不可重复读:事务两次读取同一行数据,但每次得到的数据都不一样; 幻读:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据 6.6 SQL中的事务 为了解决这些问题,数据库引入了“锁”的机制(从数据库系统的角度来看:分为排它锁,共享锁和更新锁。 隔离层次 四种隔离层次: 1. 可串行化(serializable) 2. 读未提交(read-uncommitted) 3. 读提交(read-committed) 4. 可重复读(repeatable-read) * * 第六章 数据库语言SQL 四种隔离级别 “读未提交” READ UNCOMMITED 最低等级的事务隔离,仅仅保证了读取过程中不会读取到非法数据,对事务可以看到的信息不加限制; “读提交” READ COMMITED 大多数主流数据库的默认事务等级,只有那些被已提交事务写入的元组才可以被这个事务看到,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。 6.6 SQL中的事务 可重复读REPEATABLE READ 查询得到的每个元组在此查询再次执行时必须重现,保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。 可串行化SERIALIZABLE(缺省) 最高等级的事务隔离,上面3种不确定情况都将被规避。这个级别将模拟事务的串行执行。 6.6 SQL中的事务 第六章 数据库语言SQL 第二章 关系数据模型 * 第六章 数
显示全部
相似文档