事務 四大屬性 1,原子性:事務是一個完整的整體,要麼都執行,要麼都不執行 2,一致性:當事務完成時,數據必須處於一致狀態 3,隔離性:對數據修改的所有併發事務是彼此隔離的,即事務必須是獨立的,不應以任何方式依賴於或影響其他 4,永久性:事務完成後,對資料庫的操作永久保留 事務控制 BEGIN:開始 ...
事務
四大屬性
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裡面,要修改的數據和被修改的數據不能來自同一張表