-- B程序 事务
USE 教务数据库
BEGIN TRAN --开启一个事务
PRINT GETDATE()
PRINT '正在执行第二个事务... ‘
UPDATE 课程表 SET 学分=2 WHERE 课程号='3003'
--将课程表中课程号为的学分改为2, 锁定课程表
WAITFOR DELAY '00:00:5' --等待5秒,再执行下一条命令
UPDATE 学生表 SET 专业班级=‘19软件2班’ WHERE 学号='201906003'
--将学生表中学号为的学生的专业班级改为'19软件2班',
---由于第一个事务锁定课程表,
---此事务将处于等待状态
select * from 学生表
select * from 课程表
COMMIT TRAN
PRINT GETDATE()
select * from 学生表
select * from 课程表
注意:因为我们将第1个事务(A程序)的死锁级别设置为低,因此死锁发生时,该事务将自动释放锁定资源,其中的SQL语句都被回滚了,而第二个事务(B程序)中的所有操作都被执行。
•
2.如何避免死锁
(1)按相同的顺序访问对象。
(2)最大限度地减少保持事务打开的时间。
(3)保持事务简短并在一个批处理中。
(4)避免事务中的用户交互。
要点小结:
事务的基本概念
使用显式事务
锁的类型
死锁的发生及避免
课后习题
•
一、简答题
1、事务有哪些属性?
2、SQL Server 中事务的类型有哪些?
二、上机实践题
列举一种可能会出现的死锁情况,并上机调试。