数据库----实验6 SQL Server2008事务与锁

也许,年少时不能遇见太过惊艳的人,就像你不能做我的诗,而我无法成为你的梦!

一、实验目的

前面提到,在SQL server2008这个多用户数据库中为了实现多个用户的同时存取,需要对数据库进行锁定。实验将帮助深入了解事物执行过程中,SQL server数据库是如何实现对数据行、索引页等资源,一次只让一个用户使用的。

二、实验内容

1. 问题描述

数据库----实验6 SQL Server2008事务与锁

2. 数据库设计

数据库----实验6 SQL Server2008事务与锁

数据库----实验6 SQL Server2008事务与锁 数据库----实验6 SQL Server2008事务与锁

数据库----实验6 SQL Server2008事务与锁

数据库----实验6 SQL Server2008事务与锁

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查看锁信息:

打开活动检测器:

数据库----实验6 SQL Server2008事务与锁

进程中的信息:

数据库----实验6 SQL Server2008事务与锁

可选择用户ID指定要查看的对象:

数据库----实验6 SQL Server2008事务与锁

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

数据库----实验6 SQL Server2008事务与锁

(3)①EXEC sp_help teachers;

数据库----实验6 SQL Server2008事务与锁

        EXEC sp_indexoption 'teachers.PK_TEACHERS','allowPageLocks',false;

       数据库----实验6 SQL Server2008事务与锁

(4)①begin tran

--初始锁状态

exec sp_lock

select * from TEACHERS with(UPDLOCK) where tid='1234567890'

数据库----实验6 SQL Server2008事务与锁

--加更新锁后的锁状态

exec sp_lock

update TEACHERS set salary=salary+100 where tid='1234567890'

数据库----实验6 SQL Server2008事务与锁

--执行更新操作后的锁状态

exec sp_lock

select * from TEACHERS where tid='1234567890'

数据库----实验6 SQL Server2008事务与锁

--提交事务前的锁状态

exec sp_lock

commit tran

数据库----实验6 SQL Server2008事务与锁

--提交事务后的锁状态

exec sp_lock

数据库----实验6 SQL Server2008事务与锁

begin tran

select * from TEACHERS with(UPDLOCK) where tid='200016731'

数据库----实验6 SQL Server2008事务与锁

select * from TEACHERS where tid='200016731'

update TEACHERS set salary=salary+100 where tid='200016731'

select * from TEACHERS where tid='200016731'

数据库----实验6 SQL Server2008事务与锁

数据库----实验6 SQL Server2008事务与锁

update TEACHERS set salary=salary+100 where tid='200016731'

select * from TEACHERS where tid='200016731'

commit tran

数据库----实验6 SQL Server2008事务与锁

⑤select * from TEACHERS where tid='200016731'

update TEACHERS set salary=salary+100 where tid='200016731'

select * from TEACHERS where tid='200016731'

数据库----实验6 SQL Server2008事务与锁

数据库----实验6 SQL Server2008事务与锁