sqlserver-事务处理
事務的概念:簡單說就訪問并可能更新數據庫中各種數據項的一個程序執行單元,一旦開啟事務,所有對數據的操作要么全部執行,要么全部都不執行。單條sql語句本身就是一個事務.
事務的屬性:
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有4個屬性,稱為原子性(Atomic)、 一致性(Consistent)、隔離性(Isolated)、持久性(Durable),簡稱ACID屬性,只有這樣才能構成一個事務。
原子性:整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
隔離性:兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。
持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。
工作開發過程中對事務的依賴性很強,復雜一點的sql操作一般都離不開事務.
舉個很簡單的例子,銀行轉賬是簡單可以分為兩個步驟
如:賬號A向賬號B轉1000元錢。
1、賬號B+1000元;
2、賬號A-1000元;
這兩步是不可分的,假如賬號B+1000元后,執行第二步發現賬號A余額不足時(當然實際開發中會先判斷余額,這里是假設),執行失敗,那么賬號B就多出了1000元,而賬號A卻沒減去1000元。
有了事務我們就可以保證這兩步要么全部執行,要么全部不執行。
偽代碼:
begin 事務
update 賬號表 set?money=money+1000 where 賬號=賬號B;
update 賬號表 set?money=money-1000 where 賬號=賬號A;
if 程序報錯
rollback 事務;
else
commit 事務;
--------------------------------------------------------------------------------------------------------------------------------
sql代碼
1 create table tbl_test( 2 id nvarchar(10), 3 name nvarchar(5) 4 ); 5 insert into tbl_test values('001','名字1'); 6 update tbl_test set name='名字2' where id='001' 7 update tbl_test set name='名字超過5字' where id='001' --這句話會報錯 將截斷字符串或二進制數據。?
上面的代碼最后執行完,會將名字1改為名字2
加上事務
1 begin transaction 2 update tbl_test set name='名字2' where id='001'; 3 update tbl_test set name='名字超過5字' where id='001'; 4 if @@error <> 0 5 begin 6 rollback transaction 7 end 8 else 9 begin 10 commit transaction 11 end執行結果name字段的值還是名字1,第二句update執行失敗了之后,第一句update也沒有執行。
另一種寫法:T-sql是有異常機制的
1 begin try 2 begin transaction 3 update tbl_test set name='名字2' where id='001'; 4 update tbl_test set name='名字超過5字' where id='001'; 5 commit transaction 6 end try 7 begin catch 8 --select ERROR_NUMBER() as 錯誤代碼 9 rollback transaction 10 end catch?
轉載于:https://www.cnblogs.com/fnz0/p/5444929.html
總結
以上是生活随笔為你收集整理的sqlserver-事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016浙江省赛过山车记
- 下一篇: Mybatis接口注解开发