实验十 SQL SERVER 事务设计(选做)
实验时间:2018.06.06
一、实验目的:
(1)通过实验理解事务的概念、特性,掌握事务的设计思想和事务创建、执行的方
法;
(2)掌握事务的提交 COMMIT;
(3)掌握事务的回滚 ROLLBACK;
(4)了解事务的锁。
二、实验内容:
创建一个名为“仓库职工”的数据库,导入以下的四张表到该数据库中,完成以下
各题:
职工表
仓库号
WH1
WH2
WH3
WH4
仓库号
WH2
WH1
WH2
WH3
WH1
WH3
WH1
仓库表
城市
北京
上海
广州
武汉
职工号
E1
E2
E3
E4
E5
E6
E7
面积
370
500
200
400
工资
1220
1210
1250
1230
1250
2000
2080
职工号
E3
E1
E7
E6
E3
供应商号
S7
S4
S4
S6
S4
订购表
订购单号
OR67
OR73
OR76
OR77
OR79
订购日期
2009-12-4
2009-4-1
2009-4-2
2009-1-21
2009-11-15
E1
E3
E3
S6
S6
S3
供应商号
S3
S4
S6
S7
S8
S9
供应商名
振华电子厂
华通电子公司
607 厂
爱华电子厂
胖熊公司
巧姑娘日化
2009-2-1
2009-3-12
2009-3-2
OR80
OR90
OR91
供应商表
地址
西安
北京
郑州
北京
广州
北京
1. 创建事务,并执行。功能为实现广州的职工加 10%的工资.
set 工资=工资*1.1
Begin transaction
Use cangku
Go
Update 职工
From 职工,仓库
Where 职工.仓库号=仓库.仓库号 and 城市=’广州’
Go
Commit
Go
Begin transaction
Use 仓库职工
Go
Update 职工表
From 职工表,仓库表
Where 职工表.仓库号=仓库表.仓库号 and 城市='广州'
Go
Commit
Go
执行前:
set 工资=工资*1.1
执行后:
(2)在 select 语句中加锁,悲观锁定职工表。
Begin transaction
Select
* From 职工表 with(xlock)
Insert into 职工表(仓库号,职工号)
Update 职工表 set 工资=2980
Where 仓库号=‘WH2’ and 职工号=‘E10’
values(‘WH2’,’E10’)
*
Commit transaction
Begin transaction
Select
From 职工表 with(xlock)
Insert into 职工表(仓库号,职工号)
Update 职工表 set 工资=2980
Where 仓库号='WH2' and 职工号='E10'
Commit transaction
执行前:
values('WH2','E10')
执行后:
count(供应商号) From 供应商表
(3)使用 HOLDLOCK 对供应商表加共享锁。
Begin transaction t2
Select 供应商号 From 供应商表 with(holdlock)
Select
Commit
Begin transaction t2
Select 供应商号
From 供应商表 with(holdlock)
Select count(供应商号) From 供应商表
Commit
三、思考题:
1.什么是事务?事务和程序是一个概念吗?
答:事务(Transaction)是并发控制的单位,是用户定义的一个操作序
列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过
事务,SQL Server 能将逻辑相关的一组操作绑定在一起,以便服务器保
持数据的完整性。它与程序的概念不同
2. 解释语句 rollback 和 commit 的作用。
答:COMMIT 是表示【提交】,就是提交事务的所有操作。具体地说,就
是将事务中的所有对数据库的更新写回到磁盘上的物理数据库中去,
事务正常结束。ROLLBACK 指的是【回滚】,即是在事务的运行过程中,
发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有
的已完成的操作全部撤销,回滚到事务开始之前的状态。
3. 为何使用事务?
答:事务是单个的工作单元。如果某一事务成功,则在该事务中进行
的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务
遇到错误且必须取消或回滚,则所有数据修改均被清除。
事务使用,可以提供一个机制,防止在执行过程中出错而之前正确的
sql 有影响了数据库的情况出现
4. 乐观锁和悲观锁的优缺点各是什么?
答:悲观锁有缺点:悲观并发控制实际上是“先取锁再访问”的保守
策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的
机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,
在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只
能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数
据,其他事务就必须等待该事务处理完才可以处理那行数。
乐观锁优缺点:乐观并发控制相信事务之间的数据竞争(data race)的
概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,
所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会
遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过
修改以后写回数据库,这时就遇到了问题.
四、实验心得
答:通过实验理解事务的概念、特性,掌握事务的设计思想和事务创建、执行的方
法;掌握了事务的提交 COMMIT、掌握了事务的回滚 ROLLBACK 和了解了事务的锁