SQL Server——事务

相关语法请参考:https://blog.csdn.net/weixin_43319713/article/details/104426491

 

什么是事务?

多个用户同时对同一个数据进行修改。要么只更新,要么只添加,要么只删除

假设:我要更新Student表中某一个学生的信息,这个SQL语句执行的过程我们就可以分为两步:

第一步,删除这个学生原来的学籍信息

第二步,把要更新的学籍信息添加进去

那么,你有没有思考过这样一个问题呢?如果这个过程中的某一个步骤错误了,比如,删除了原来信息,但添加时因为某种原因却没有将数据添加进去,这时是不是数据就出现了缺失?那时的你将会惊慌失措,痛恨自己手抖。

这时我们就可以使用事务,必须两个步骤都成功了表才会发生变化,否则就恢复到表原来的状态

 

事务的特点是什么?

要么都成功,要么都失败

 

举例

现有一个名为【student】的表,表内没有任何数据,为空

CREATE TABLE [dbo].[student](
	[SId] [int] NULL,
	[Sname] [varchar](10) NULL,
	[Sage] [varchar](10) NULL,
	[Ssex] [varchar](10) NULL,
	[民族] [varchar](50) NULL
)

需求:向表内添加学籍信息

一、当执行的事务中有错误时,返回表的初始状态

begin tran     --开始事务
begin try      
    insert into student values('1','赵四','17','女','汉族')     --正确语句
    insert into student values('aa','赵四','17','女','汉族')    --错误语句
end try
begin catch      --捕捉错误信息
    select Error_line() as ErrorLine,           --产生错误的行号
           Error_message() as ErrorMessage      --错误原因
    if(@@TRANCOUNT>0)                           --全局变量,判断是否开启了事务
    rollback tran         --如果有错误就回滚事务
end catch
if(@@trancount>0)       
commit tran               --提交事务

select * from student     

返回结果:

 

 

二、当事务中的语句都正确时,执行成功

begin tran     --开始事务
begin try      
    insert into student values('1','赵四','17','女','汉族')     --正确语句
    insert into student values('2','赵四','17','女','汉族')    --错误语句
end try
begin catch      --捕捉错误信息
    select Error_line() as ErrorLine,           --产生错误的行号
           Error_message() as ErrorMessage      --错误原因
    if(@@TRANCOUNT>0)                           --全局变量,判断是否开启了事务
    rollback tran         --如果有错误就回滚事务
end catch
if(@@trancount>0)       
commit tran               --提交事务

select * from student     

 

三、设立保存点

作用:相当于备份保存点的数据

begin tran
insert into student values('1','王菲','17','女','汉族')    --正确语句
save tran a_point                                      --保存点a
insert into student values('2','王菲','17','女',null)     
save tran b_point                                      --保存点b
insert into student values('3','王菲','17','女','汉族')    
begin 
	rollback tran a_point     --回滚保存点b
	commit tran
end

select * from student

返回结果:

发布了42 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43319713/article/details/105396740