相關語法請參考: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
返回結果: