SQL入門經典(十)之事務

来源:http://www.cnblogs.com/panda951010/archive/2016/06/27/5619824.html
-Advertisement-
Play Games

事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都 ...


     事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都不發生。來看一個一個經典事例。這個事例各大書籍講事務都有。就是你去銀行轉帳給朋友。轉了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里的代碼

本來講瑣的。鎖這塊以後會補上。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AlertDialog有以下六種使用方法: 一、簡單的AlertDialog(只顯示一段簡單的信息) 二、帶按鈕的AlertDialog(顯示提示信息,讓用戶操作) 三、類似ListView的AlertDialog(展示內容) 四、類似RadioButton的AlertDialog(讓用戶選擇,單選 ...
  • 1.1 普通標題 1.1.1 標題內容管理 1.1.2 幫助和返回的按鈕 1.2 未登錄的標題 1.3 登陸中的標題 1.4 登陸完成後的標題 2.1 清單文本配置 2.2 新建menu資源文件 2.3 Activity中設置 清單文件: 設置主題是Theme.Holo下麵的就可以 <applica ...
  • 今天簡單的介紹 一下啊 android EventBus 的使用 EventBus 在官方介紹中是訂閱......什麼的 一大堆 , 在我android 菜鳥眼裡 就是用來代替android 廣播的 簡單粗暴 效率高; 其實用法挺簡單 的 就 三步 註冊(官方叫訂閱) 接收 取消(取消訂閱). 算了 ...
  • 1、nonnull:字面意思就能知道:不能為空(用來修飾屬性,或者方法的參數,方法的返回值) 代碼: 這樣,你在使用以上方法的時候會出現這種效果提示 同樣,使用屬性的時候: 2、nullable:表示可以為空(使用方法和上面幾乎一樣,但是沒有發現和上面類似的巨集) 代碼(大概看一下,參考上面就行了): ...
  • 作者:楓雪庭 出處:http://www.cnblogs.com/FengXueTing-px/ 歡迎轉載 Android學習心得之 Linux下命令行Android開發環境的搭建 1. 前言2. Java以及Ant安裝3. Android SDK安裝4. Android工程的基礎命令 一、前言 本 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 上一篇階段一:一個簡單的天氣預報應用的完整實現過程(一)完成了應用的核心功能,接下來就要對它進行優化。今天我先優化它的部分UI和設置一些動畫。 首先,說明一下,這部分都是我現學現做的,弄的時候也挺折騰的,所以我想先 ...
  • 1,安裝oracle 10g資料庫並創建一個要恢復的資料庫相同一的實例(註意:最好是新安裝的資料庫,並且安裝的資料庫儘量和要恢復的資料庫的版本一致,並且實例必須一致); 2,以sysdba身份登錄:對控制文件進行備份; sqlplus /nolog;(此處不能加分號,否則黑屏視窗會一閃而過) con ...
  • K-Means聚類演算法是最為經典的,同時也是使用最為廣泛的一種基於劃分的聚類演算法,它屬於基於距離的無監督聚類演算法。KMeans演算法簡單實用,在機器學習演算法中占有重要的地位。對於KMeans演算法而言,如何確定K值,確實讓人頭疼的事情。 最近這幾天一直忙於構建公司的推薦引擎。對用戶群體的分類,要使用KM ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...