事務
四大屬性
1,原子性:事務是一個完整的整體,要么都執行,要么都不執行
2,一致性:當事務完成時,資料必須處于一致狀態
3,隔離性:對資料修改的所有并發事務是彼此隔離的,即事務必須是獨立的,不應以任何方式依賴于或影響其他
4,永久性:事務完成后,對資料庫的操作永久保留
事務控制
BEGIN:開始事務
COMMIT:提交事務,COMMIT 命令用于保存事務對資料庫所做的更改,
ROLLBACK:回滾事務,ROLLBACK 命令用于撤銷尚未保存到資料庫中的事務,
一旦事務提交或回滾,則事務結束,
注:為判斷陳述句執行是否出錯,可使用全域變數@@ERROR,
舉個栗子
題目:改變B表中張三的性別為2時,王五更改為1

代碼如下:
--開始事務
begin tran
--定義變數,存盤錯誤變數
declare @cw int
set @cw=0
update B set sex=2 where name='張三'
--用@@ERROR判斷陳述句執行是否成功
set @cw+=@@ERROR
update B set sex=1 where name='王五'
set @cw+=@@ERROR
--判斷陳述句執行是否成功
if(@cw<>0)
begin
--不等于0,陳述句出錯,回滾事務
print '陳述句執行失敗,已回滾'
rollback tran
end
else
begin
--等于0,提交事務
print '陳述句執行成功,已提交'
commit tran
end
結果:

其實最適合使用事務的,是類似于轉賬一類的操作,一邊余額減少,一邊余額就要增加,如果余額減少失敗,事務回滾,那么相應的,另一邊的余額也就不會再增加
觸發器
DML觸發器:
??用戶通過資料操作陳述句 DML(對表或視圖的insert、delete、update)編輯資料,則執行DML觸發器,系統將觸發器和觸發它的陳述句作為可在觸發器內回滾的單個事務對待,如果檢測到錯誤,則整個事務自動回滾,
舉個栗子:
有題:--A表張三語文成績減1,就給B表王五的出生年月加1
表A

表B

代碼:
--判斷觸發器是否存在
if exists(select * from sys.triggers where name='trig_update')
drop trigger trig_update
go
--創建觸發器
create trigger trig_update
--在A表中創建
on A
--修改觸發器
for update
--當觸發觸發器后要做的操作
as
--定于變數存盤錯誤資訊
declare @a int
set @a=0
update B set chusheng+=1 where name='王五'
set @a+=@@ERROR
--不等于0則修改失敗
if(@a<>0)
begin
print '王五資訊修改失敗'
end
else
begin
print '王五資訊修改成功'
end
go
結果:

此觸發器執行的就是DML觸發器里的update,當A表發生改變,相應的B表也應該進行相關操作,值得注意的是,在update里面,要修改的資料和被修改的資料不能來自同一張表
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511008.html
標籤:SQL Server
