相关语法请参考:SQL中的事务问题_吃豆子的恐龙的博客-CSDN博客
什么是事务?
多个用户同时对同一个数据进行修改。要么只更新,要么只添加,要么只删除
假设:我要更新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
返回结果: