第 13章 事务与锁
13.1 事务
13.2 锁
13.1 事务
一、事务:是作为单个逻辑单元执行的一系列操
作,这一系列操作或者都被执行或者
都不被执行。
二、事务的属性
原子性:或者都被执行或者都不被执行。
一致性:事务完成时,所有数据保持一致。
隔离性:不能看到事务的中间状态。
持久性:事务完成后对系统的影响是永久的。
三、事务组织结构的一般形式
1、定义一个事务的开始
BEGIN TRANSACTION 事务名
2、提交一个事务
COMMIT TRANSACTION 事务名
3、回滚事务
ROLLABCK TRANSACTION 事务名
例 1:定义一事务向 StuCou表插入 3条记录,并提交完成。
USE Xk
GO
BEGIN TRANSACTION
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','001',1)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','002',2)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','003',3)
COMMIT TRANSACTION
测试,SELECT * FROM StuCou WHERE StuNo='00000025'
例 2,定义一事务向 StuCou表插入 3条记录,并回滚。
USE Xk
GO
BEGIN TRANSACTION
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','001',1)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','002',2)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','003',3)
ROLLBACK TRANSACTION
测试,SELECT * FROM StuCou WHERE StuNo='00000025'
例 3、向 StuCou表插入多条记录,并检验若报名课程超过
4门,则回滚事务,即报名无效,否则成功提交。
USE Xk
BEGIN TRANSACTION
--报 3或 5门课程
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES('00000025','001',1)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','002',2)
INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','003',3)
--INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','004',4)
--INSERT StuCou(StuNo,COuNo,WillOrder)
VALUES ('00000025','005',5)
DECLARE @CountNum INT
SET @CountNum= (SELECT COUNT(*) FROM StuCou
WHERE StuNo='00000025')
IF @CountNum>4
BEGIN
ROLLBACK TRANSACTION
PRINT '超过报名门数! '
END
ELSE
BEGIN
COMMIT TRANSACTION
PRINT '报名成功! '
END
例 4、嵌套事务示例,只有在提交外部事务后,数据
修改才会生效。不能撤销最内层事务。
CREATE TABLE TestTran (A INT,B CHAR(3))
GO
BEGIN TRANSACTION Tran1
INSERT INTO TestTran VALUES (1,'aaa')
GO
BEGIN TRANSACTION Tran2
INSERT INTO TestTran VALUES (2,'bbb')
GO
BEGIN TRANSACTION Tran3
INSERT INTO TestTran VALUES (3,'ccc')
--提交事务
COMMIT TRANSACTION Tran3
COMMIT TRANSACTION Tran2
COMMIT TRANSACTION Tran1
--回滚事务
ROLLBACK TRANSACTION Tran1
ROLLBACK TRANSACTION