第13章事务与锁 13.1事务 13.2锁
第13章 事务与锁 13.1 事务 13.2 锁
131事务 事务:是作为单个逻辑单元执行的一系列操 作,这一系列操作或者都被执行或者 都不被执行。 事务的属性 原子性:或者都被执行或者都不被执行 致性:事务完成时,所有数据保持一致 隔离性:不能看到事务的中间状态。 持久性:事务完成后对系统的影响是永久的
13.1 事务 一、事务:是作为单个逻辑单元执行的一系列操 作,这一系列操作或者都被执行或者 都不被执行。 二、事务的属性 原子性:或者都被执行或者都不被执行。 一致性:事务完成时,所有数据保持一致。 隔离性:不能看到事务的中间状态。 持久性:事务完成后对系统的影响是永久的
事务组织结构的一般形式 1、定义一个事务的开始 BEGIN TRANSACTION事务名 2、提交一个事务 COMMIT TRANSACTION事务名 3、回滚事务 ROLLABCK TRANSACTION事务名
三、事务组织结构的一般形式 1、定义一个事务的开始 BEGIN TRANSACTION 事务名 2、提交一个事务 COMMIT TRANSACTION 事务名 3、回滚事务 ROLLABCK TRANSACTION 事务名
例1:定义一事务向 Stucou表插入3条记录,并提交完成。 USE XK GO BEGIN TRANSACTION INSERT StuCou( StuNo, COuNo, WillOrder VALUES(0000253,001’,1) INSERT StuCou (StuNo, COuNo, Willorder) VALUES(000000253,”002,2 INSERT StuCou ( StuNo, COuNo, Willorder) VALUES(000000253,003,3) COMMIT TRANSACTION 测试: SELECT* FroM Stu Cou WHERE StuNo=00000025
例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(00025,001’,1) INSERT StuCou(StuNo, COuNo, WillOrder) VALUES(025,”002,2) INSERT StuCou(StuNo, COuNo, WillOrder VALUES(000000253,”003,3) ROLLBACK TRANSACTION 测试: SELECT* froM StuCou WherE StuNo=20000025
例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(00000253,”001’,1) INSERT StuCou(StuNo, COuNo, WillOrder VALUES(00000053,”002,2) NSerT StuCou(StuNo, COuNo, WillOrder VALUES(0000053,”003,3) INSERT StuCou(StuNo, COuNo, Willorder) VALUES(0000005,”004,4) INSERT StuCou ( StuNo, COuNo, Willorder
例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 QCount Num=(SELECT COUNT (*)FROM StuCou WHERE StuNO= 00000025 lf @CountNum>4 BEGIN ROLLBACK TRANSACTION PRINT’超过报名门数! END ELSE BEGIN COMMIT TRANSACTION PRINT报名成功! END
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 Test Tran (A INT, B CHAR (3)) GO BEGIN TRANSACTION Tranl INSERT INTO TestRan values(1,’aa’) GO BEGIN TRANSACTION Tran2 INSERT INTO TestRan values(2,’bbb’) GO BEGIN TRANSACTION Tran3 INSERT INTO TestTran values(3, ' ccc')
例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 Tran COMMIT TRANSACTION Tran1 回滚事务 ROLLBACK TRANSACTION Tranl ROLLBACK TRANSACTION
--提交事务 COMMIT TRANSACTION Tran3 COMMIT TRANSACTION Tran2 COMMIT TRANSACTION Tran1 --回滚事务 ROLLBACK TRANSACTION Tran1 ROLLBACK TRANSACTION