標籤:撤銷 arch 序列 strong 操作 語句 解決 樣本 一個
簡介
事務是單個的工作單元,這就意味著單元內有多個操作,事務是多個操作的整合體。如果某個事務執行成功,則涵蓋在這個事務裡的所有資料操作均會一併執行提交,成為資料庫中的永久組成部分。
如果事務因某項操作執行錯誤,那麼事務內所有的操作都將無效,事務實行復原機制,資料操作都會還原到初始為更改的狀態。
為什麼需要事務
在銀行業務中,有一條記賬原則,即有借有貸,借貸相等。為了保證這種原則,每發生一筆銀行業務,就必須確保賬目上借方和貸方至少個記一筆賬,並且這兩筆賬要麼同時成功,要麼同時失敗。
如果賬目上的記錄只出現了借方,或者只出現了貸方。那麼這就違反了記賬的原則,出現記賬錯誤的情況。此業務情境就是事務典型的體現,通過交易處理的處理機制,才可以解決此類業務情境。
樣本分析
業務情境:
銀行轉賬往往涉及兩個或兩個以上的賬戶,包括轉出對象和轉入對象兩種。在轉出的存款金額減少一定金額的同時,轉入賬戶會增加相應金額的存款。接下來以轉賬的情境為例,用代碼示範轉賬的過程。
資料準備:
--建立表if exists(select * from sysobjects where name=‘bank‘ )drop table bankgocreate table bank( customerName nvarchar(4), currentMoney money)go--添加約束:賬戶餘額(currentMoney)不能少於1元,否則視為銷戶alter table bankadd constraint ck_currentMoney check (currentMoney>=1)go--插入測試資料,即轉賬的兩個對象:張三賬戶餘額為1000元,李四賬戶餘額為1元insert into bank values (‘張三‘,1000),(‘李四‘,1);go--查看結果select * from bank go
使用SQL語句類比轉賬功能:
邏輯:從張三的賬戶直接轉賬1000元到李四的賬戶,張三賬戶減少1000元。李四賬戶增加1000元。
代碼如下:
--根據商務邏輯編寫SQL語句執行資料操作--轉出update bank set currentMoney=currentMoney-1000 where customerName=‘張三‘--轉入update bank set currentMoney=currentMoney+1000where customerName=‘李四‘
執行結果:
結果分析:
張三轉給李四的1000元並沒有從賬戶裡扣除,李四的賬戶卻多了1000元,轉賬後兩個賬戶的餘額總和變為1000+1001=2001,存入銀行的錢憑空多出1000元。如果此操作發生在生活中,想一想是多麼可怕的事情。此操作的原因是因為之前在建立表的時候定義的約束,導致第一個SQL命令無法執行,下一個SQL沒有因為中斷停止執行。
如果在程式中,可能會用代碼邏輯去控制,即等第一個命令執行成功在執行下一個命令,這樣雖然可以監控第一個命令的結果做出對應的處理。但是如果第一個命令執行成功,第二個命令執行出錯該怎麼辦,這樣還是無法確保一個業務的整體性。
我們可以使用事務機制來解決此問題,轉賬過程就是一個事務,它需要兩條或者更多條SQL語句來完成一系列的操作,不管有多少條命令,它們始終圍繞著一個主題就是轉賬。如果其中某個步驟出錯,則整個轉賬業務也不能成立,應出錯要把事務中操作的資料恢複為原來的資料。在開發中如果不使用交易處理機制,我們是很難保證事務中單個操作不出錯的。一旦事務中某個操作出錯就導致了整體的邏輯性。
事務的概念
事務是一種機制,一個操作序列,它包含了多個操作命令,並且把所有的命令作為一個整體並都圍繞著一種業務主題一起向系統提交或撤銷操作請求,即這一組命令要麼都執行,要麼都不執行,通俗的理解就是共同進退。因此事務是一個不可分割的工作邏輯單元,在資料庫系統上執行並行作業時,事務是作為最小的控制單元來使用的,它特別適用於多使用者同時操作的資料庫系統。例如,航空公司的訂票系統、銀行、保險公司等。
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,即原子性、一致性、隔離性、持久性,這些特性簡稱為ACID。
SQL Server事務