例2:飞机订票系统中的一个活动序列 ①甲售票点(甲事务)读出某航班的机票余额A,设A=16; ②乙售票点(乙事务)读出同一航班的机票余额A,也为16; ③甲售票点卖出一张机票,修改余额A←A-1,所以A为15, 把A写回数据库 ④乙售票点也卖出一张机票,修改余额A←A1,所以A为 15,把A写回数据库 结果明明卖出两张机票,数据库中机票余额只减少1;
例2:飞机订票系统中的一个活动序列 ; ① 甲售票点(甲事务)读出某航班的机票余额A,设A=16; ② 乙售票点(乙事务)读出同一航班的机票余额A,也为16; ③ 甲售票点卖出一张机票,修改余额A←A-1,所以A为15, 把A写回数据库; ④ 乙售票点也卖出一张机票,修改余额A←A-1,所以A为 15,把A写回数据库 结果明明卖出两张机票,数据库中机票余额只减少1 ;
(2)读“脏数据”( dirty read) 当T1和T2并发执行时,在T对数据库更新的结果没有提 交之前,T2使用了T1的结果,而在T2操作之后T又回滚, 这时引起的错误是T2读取了T1的“脏数据
(2)读“脏数据” (dirty read) 当T1和T2并发执行时,在T1对数据库更新的结果没有提 交之前,T2使用了T1的结果,而在T2操作之后T1又回滚, 这时引起的错误是T2读取了T1的“脏数据
发生读“脏数据”的过程 顺序 任务 操作 库存量 T1 读库存量 50 1234567 库存量=50+100 写库存量 150 T2 读库存量 150 T2 库存量=150-40 T1 ROLLBACK T2 写库存量 110
发生读“脏数据”的过程 顺序 任务 操作 库存量 1 T1 读库存量 50 2 T1 库存量=50+100 3 T1 写库存量 150 4 T2 读库存量 150 5 T2 库存量=150-40 6 T1 ROLLBACK 7 T2 写库存量 110
(3)不可重复读( Non-repeatable Read) 当T读取数据A后,T2执行了对A的更新,当T再次读取数 据A(希望与第一次是相同的值)时,得到的数据与前 次不同,这时引起的错误称为“不可重复读
(3)不可重复读(Non-repeatable Read) 当T1读取数据A后,T2执行了对A的更新,当T1再次读取数 据A(希望与第一次是相同的值)时,得到的数据与前一 次不同,这时引起的错误称为“不可重复读