数据库----实验6 SQL Server2008事务与锁
也许,年少时不能遇见太过惊艳的人,就像你不能做我的诗,而我无法成为你的梦!
一、实验目的
前面提到,在SQL server2008这个多用户数据库中为了实现多个用户的同时存取,需要对数据库进行锁定。实验将帮助深入了解事物执行过程中,SQL server数据库是如何实现对数据行、索引页等资源,一次只让一个用户使用的。
二、实验内容
1. 问题描述
2. 数据库设计
3. 程序实现及测试结果
(1)提供三种方法来监视和跟踪SQL server中的锁的活动信息:
①使用sp_lock存储过程:
Ⅰ更新事务语句:
begin tran
update courses set hour=80 where cid='10001';
Ⅱ打开另一个数据库执行:
Exec sp_lock
Go;
Ⅲ显示与53相关的锁:
Exec sp_lock 53;
②使用Management Studio查看锁信息:
打开活动检测器:
进程中的信息:
可选择用户ID指定要查看的对象:
(2)建表
create table R
(
日期 datetime not null,
班次 varchar(8) not null,
座号 varchar(8) not null,
状态 varchar(8),
primary key(日期,班次,座号)
);
insert into R
values
('2020-06-04 07:30','K123','11',NULL),
('2020-06-05 07:30','k122','34',NULL),
('2020-06-05 09:00','k052','94',NULL),
('2020-06-06 10:15','k777','2F',NULL);
查询
select * from R;
DECLARE @d datetime,@t char(6),@n char(10),@s char(2)
//输入@d,@t,@n
BEGIN TRANSACTION
SELECT @n=座号 FROM R WITH(UPDLOCK) WHERE 日期[email protected] AND 班次[email protected] AND 状态 IS NULL
IF UPDATE R SET 状态='Y' WHERE 座号[email protected] AND 日期[email protected] AND 班次
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
(3)①EXEC sp_help teachers;
②EXEC sp_indexoption 'teachers.PK_TEACHERS','allowPageLocks',false;
(4)①begin tran
--初始锁状态
exec sp_lock
select * from TEACHERS with(UPDLOCK) where tid='1234567890'
--加更新锁后的锁状态
exec sp_lock
update TEACHERS set salary=salary+100 where tid='1234567890'
--执行更新操作后的锁状态
exec sp_lock
select * from TEACHERS where tid='1234567890'
--提交事务前的锁状态
exec sp_lock
commit tran
--提交事务后的锁状态
exec sp_lock
②begin tran
select * from TEACHERS with(UPDLOCK) where tid='200016731'
③select * from TEACHERS where tid='200016731'
update TEACHERS set salary=salary+100 where tid='200016731'
select * from TEACHERS where tid='200016731'
④update TEACHERS set salary=salary+100 where tid='200016731'
select * from TEACHERS where tid='200016731'
commit tran
⑤select * from TEACHERS where tid='200016731'
update TEACHERS set salary=salary+100 where tid='200016731'
select * from TEACHERS where tid='200016731'