实验九 事务与死锁*
课程名称: 学时
数据库原理实验 4
实验类型:
验证型
实验目的
1.了解事务的ACID属性,掌握事务和批处理的工作原理。 2.了解死锁的类型和其兼容性。 3.了解死锁发生的情况。 4.了解可锁定的资源。
5.了解死锁的一般处理过程。 实验内容:
1.银行业务数据库bankdb,其中,帐户信息表(bank)存放帐户的信息,交易信息表(transInfo)存放每次的交易信息。 (1)试用事务解决银行转帐问题。
参考代码如下: BEGIN TRANSACTION
/*--定义变量,用于累计事务执行过程中的错误--*/ DECLARE @errorSum INT
SET @errorSum=0 --初始化为0,即无错误
/*--转帐:张三的帐户少1000元,李四的帐户多1000元*/ UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName='张三' SET @errorSum=@errorSum+@@error
UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName='李四'
SET @errorSum=@errorSum+@@error --累计是否有错误 IF @errorSum<>0 --如果有错误 BEGIN
print '交易失败,回滚事务' ROLLBACK TRANSACTION END ELSE BEGIN
print '交易成功,提交事务,写入硬盘,永久的保存' COMMIT TRANSACTION
14
END GO
print '查看转帐事务后的余额' SELECT * FROM bank GO
(2)试演示:分别转帐1000和800时的转帐情况。注意:转账时不得出现透支。
2.实验内容
1)锁与并行查询执行相关的资源。 2)如何查看进程信息。 实验步骤
打开两个查询窗口,并发执行下面两个事务 2)
--transaction 1 begin tran update student set age=20
where student_name='曹雨'
--阻塞秒钟
waitfor delay '00:00:10'
update sc
set writtenScore=76
where student_id='g9940201' and course_id='dep04_b001' commit;
2)
--transaction 2 begin tran update sc
set writtenScore=76
where student_id='g9940201' and course_id='dep04_b001'
--阻塞秒钟
waitfor delay '00:00:10'
update student set age=20
where student_name='曹雨'
15
commit;
3)处理死锁的一般过程或步骤。
Sp_who:提供关于当前Microsoft SQL Server用户和进程信息。如:列出
全部当前进程。
在SQL查询分析器的命令窗口中输入 sp_who
sp_lock:报告有关锁的信息
在SQL查询分析器的命令窗口中输入
sp_lock @spid1=从sp_who中查出的进程标识号 实验报告
1、实验各项内容实现的过程。 2、实验结果分析。
16