实验六 事务与并发控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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/*读数据*/