实验六 事务与并发控制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六事务与并发控制

班级:软件1412 姓名:王茂潭学号:1411651214

一.实验目的

1.理解事务的基本概念

2.掌握定义事务和使用事务的方法。

3.验证并发操作带来的数据不一致性。

4.了解锁机制。

二.实验内容

1.定义事务,将课程表中的“数据库”课程名称改为“数据库原理”,并提交该事务。

2.定义事务,删除授课表和教师表中教师号为“120578”的记录,并提交该事务。

3.设计事务验证并发操作带的数据不一致性。

设计账户表account,表结构如表1所示,表中数据如表2所示。

(1)分别新建2个查询,定义2个事务。事务1从1201账户取出100元,在事务1提交之前,事务2又从1201账户取到50元,然后读取账户表,最后分别提交事务1和事务2。程序样例中并发控制一和二,哪个会出现丢失修改?为什么? 注:在事务1中,使用“WAITFOR DELAY ”等待事务2的执行,以模拟并发操作。

(2)分别新建2个查询,定义2个事务。事务1读取账户余额。事务2从1201账户取出100元,然后事务1再次读账户余额,最后分别提交事务1和事务2。程序样例中的并发控制程序执行后,分析事务1两次读取的账户余额是否一致,会出现不可重复读吗?

注:在事务1中,使用“WAITFOR DELAY ”等待事务2的执行,以模拟并发操作。

(3)分别新建2个查询,定义2个事务。事务1从1201账户取出100元,事务2读账户余额,然后事务1回滚事务,最后分别提交事务1和事务2。程序样例中的并发控制程序执行后,事务2读取的账户余额与数据库中的数据是否一致,

会出现读脏数据吗?

注:在事务1中,使用“WAITFOR DELAY”等待事务2的执行,以模拟并发操作;在定义事务之前,使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”重新设置事务的隔离级别。

4.解决3中出现的数据不一致问题

(1)在从账户取钱之前,为账户表加上排它锁,以解决丢失修改问题。

(2)设置隔离级别“SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ”,以解决不可重复读问题。

(3)设置隔离级别“SET TRANSACTION ISOLATION LEVEL READ COMMITTRED”,以解决读脏数据问题。

程序样例:

3.(1)并发控制一

begin transaction /*事务T1*/

declare @sum float

update account set balance= balance -100 where id=1201

/*从1201账户取出100元*/

waitfor delay '00:00:10'

set @sum=(select balance from account where id=1201)

if @sum<0 rollback else commit /*余额不足*/

begin transaction /*事务T2*/

declare @sum float

update account set balance= balance -50 where id=1201

/*从1201账户取出50元*/

set @sum=(select balance from account where id=1201)

if @sum<0 rollback else commit/*余额不足*/

并发控制二

begin transaction /*事务T1*/

declare @sum float

set @sum=(select balance WITH (tablockx) from account where id=1201)

waitfor delay '00:00:10'

update account set balance=@sum-100 where id=1201

/*从1201账户取出100元*/

if @sum-100<0 rollback else commit/*余额不足*/

begin transaction /*事务T2*/

declare @sum float

set @sum=(select balance from account where id=1201) update account set balance=@sum-50 where id=1201

/*从1201账户取出100元*/

if @sum-50<0 rollback else commit/*余额不足*/

(2)

begin transaction /*事务T1*/

select balance from account where id=1201/*读数据*/

waitfor delay'00:00:10'

select balance from account where id=1201/*读数据*/

commit

begin transaction /*事务T2*/

update account set balance=balance-100 where id=1201

/*修改数据*/

commit

(3)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

begin transaction /*事务T1*/

select balance from account where id=1201/*读数据*/

相关文档
最新文档