事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都 ...
事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都不發生。來看一個一個經典事例。這個事例各大書籍講事務都有。就是你去銀行轉帳給朋友。轉了100元sql如下:你的帳號扣了100元,你朋友帳號加了100元。看起來很完美。其實有個BUG存在,你的帳號被扣100元後在執行你朋友帳號加100元時候,數據出現錯誤,沒有添加進去。
ACID事務
如果你的系統被設計為使用ACID事務,則不會出現上面那種情況。ACID事務
1.原子性:事務會全部執行,要麼全部不執行。
2.一致性:需要遵循所有約束以及其他資料庫完整性規則,並且完全的更新所有相關的對象(數據和索引頁)
3.隔離性:每一個事務與其他任何事務完全的隔離。一個事務動作不會受其它事務動作干擾。
4.持久性:完成事務後,它的作用結果永久保存在系統內部。數據是“安全的”。這是指不會在停電或者系統故障或設備故障不會導致數據寫入一半的情況發生。
事務簡單操作簡介
你需要一種辦法確保第一條SQL語句執行,第二條也跟著執行。實際上不存在這樣一種可完全控制可能。從硬體故障到違反數據完整性規則簡單事情。都有可能發生錯誤。然而幸運的是;有一種可能達到相同的目地方法-基本忘記從前發生什麼事。至少可以強制這個概念:如果某件事沒有發生,那什麼不會發生,至少事務的作用範圍內部就是這樣。
如何標誌標誌是開始和結束,回滾
BEGIN TRAN : 設置為起點
COMMIT TRAN :讓事務成為數據中心永久的,不可逆的一部分
ROLLBACK TRAN:不考慮所有更改,本質上想說忘記以前發生的一卻
SAVE TRAN:創建一個特定標識符,只允許部分回滾
BEGIN TRAN 事務開始很好理解,它唯一目的就是表示一個執行單元開始。高級部分不討論了,因為面向DBA的高級特性。
COMMIT TRAN 提交事務一個終點,當發出COMMIT TRAN命令時候,可以認為該事務是持久性
ROLLBACK TRAN 每當考慮ROLLBACK TRAN 時候表示。表示該執行單元有錯誤。或者回到起點重新開始。(忘記過去,重新開始)
SAVE TRAN 保存事務創建書簽。創建書簽在數據回滾時候,回滾到每個書簽上。記住ROLLBACK在回滾會清除所有書簽。如果保存了5個書簽,一旦執行ROLLBACK,5個書簽全部清空。
試一試事務:
我朋友在幫市公安局做數據維護,因為資料庫不安全。經常被黑客攻擊在一些標題加入跳轉HTML代碼。我朋友每隔一段時間就清除一下HTML代碼,突然有一天我朋友sql寫錯了。替換之後有個表欄位值被清空,馬上使用備份,備份文件和現在文件相差一個月。因為伺服器備份出錯了。一個月沒有備份不知道。最後通過省公安局備份數據還原那個欄位的值。如果使用事務,發現不對,可以回滾。我們接著事務先看SQL語句和結果看事務有什麼神奇之處。
USE panda --繼續用這個資料庫 GO SELECT * FROM dbo.test002 --結果集合 --4 122 22 [email protected] 112 --6 122 22 [email protected] 31222 --12 231 3334 [email protected] 18612345678 BEGIN TRAN UPDATE dbo.test002 SET name='test' --本來修改ID 為12的數據。忘記寫WHERE 過濾了 SELECT * FROM dbo.test002 --結果集合 --4 test 22 [email protected] 112 --6 test 22 [email protected] 31222 --12 test 3334 [email protected] 18612345678 --在查詢一次 表示我誤傷了所有數據。 那就進行回滾: ROLLBACK TRAN SELECT * FROM dbo.test002 --結果集合 --4 122 22 [email protected] 112 --6 122 22 [email protected] 31222 --12 231 3334 [email protected] 18612345678 數據正常了
如果多條語句呢?如下圖
BEGIN TRAN UPDATE dbo.test002 SET name='test' begin TRAN UPDATE dbo.test003 SET name='test' ROLLBACK TRAN --這條語句執行後,前面2條事務語句全部回滾。 COMMIT TRAN --數據會更新完畢。
數據臟讀:我執行BEGIN TRAN UPDATE dbo.test002 SET name='test' ,有些人膽子大來獲取數據,我在ROLLBACK STRN些,那他就倒霉了,這就臟讀。。。
非重覆讀取:非重覆度很容易跟臟讀混淆。只知道這個術語就可以了。
幻讀:只是在偶然的機會會出現。很少會出現。它在運行更新語句的時候,有人執行添加語句。
丟失更新:說的事例,你經理在看某個員工的工資表時候。員工A可以加工資了。你把員工A的工資從5000上調5500了。人事部B也在看A的信息。只是修改A的人事信息。在同時更新時候覆蓋了事務1.
接著SQL入門經典(九)的視圖:
說些@@EERROR這個系統錯誤號。
先看SQL語句在一句句解釋
declare @count int ; set @count=0; BEGIN TRAN UPDATE dbo.test003 set name='test' where ID=4 select @count=@count+@@ERROR; INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5')--這條語句會失敗@@ERROR這個值會>0 select @count=@count+@@ERROR; if(@count>0) ROLLBACK TRAN ELSE COMMIT TRAN --(0 行受影響) 說明@@ERROR是個錯誤號。如果發生錯誤就是>0的數字
TRY CATCH 看下麵SQL語句
BEGIN TRY --TRY 開始 BEGIN TRAN UPDATE dbo.test003 set name='test' where ID=4 INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5') COMMIT TRAN END TRY --TRY結束 BEGIN CATCH --如果TRY 發生錯誤就執行這裡面語句 ROLLBACK TRAN END CATCH --這句代碼執行結果是(0 行受影響)說明COMMIT TRAN 沒有執行。執行了ROLLBACK TRAN -- INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5') -- 改為 --INSERT dbo.test003 VALUES(2,GETDATE(),'TEST_5') --(2行受影響)TRY裡面沒有錯誤,就執行COMMIT TRAN不會執行CATCH里的代碼
本來講瑣的。鎖這塊以後會補上。