數據庫事務的隔離機制

數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。----百度百科
就是說你定義一組數據庫操作,然后告訴數據庫說這些操作要么都成功,要么都不成功。
類似于網購買東西:你付完款,商家必須把東西寄到你的手上,期間無論是庫存、快遞、快遞員、商品質量等任何一個環節出問題,商家必須把錢退回給你。那么買東西,就是一個事務。
事務的特性有四種--ACID:
  • 原子性(Atomic):這個強調事務的根本特性,一個事務內的所有操作必須像原子操作一樣,要么都成功要么都失敗,不能再拆分了。
  • 一致性(Consistent):這個強調數據的完整性。就是說事務修改前后,數據符合邏輯上的完整性。就像包裹從倉庫寄到你家,手機不能變成磚頭。
  • 隔離性(Insulation):這個強調的是兩個并發的事務應該是互不干擾的。雖然兩個包裹都是從北京寄到上海,但是A包裹被退回時,買家和賣家都沒必要去管B包裹是啥情況。
  • 持久性(Duration):這個強調事務完成后對數據庫的影響是永久的,進入一個穩定的狀態。這個是相對于事務的實現來說的,數據庫為了維持一個事務,需要做很多緩存或者臨時性的操作。持久性就是在事務結束后,這些臨時操作都正式生效了。比如你手機確認收貨后,買手機的過程就正式完成了。對于賣家來說,再有別的問題,那就是售后的問題,而不是銷售的問題了。
相信讀者在看到事務的隔離性時,就會有疑問:兩個并發的事務不能同時修改同一條數據,那同時讀一條數據時怎么辦呢?
這就會涉及數據庫對事務的隔離控制:很明顯,不能讓兩個并發的事務同時修改同一條數據,但是照顧到性能,也不能不讓兩個事務同時讀同一條數據吧?“查詢”這么無公害的操作,何必要趕盡殺絕呢?

先看看,如果兩個事務同時操作同一條數據,會帶來哪些問題:
1.丟失更新:當前余額為:1,A事務的功能是把余額+1;B事務的功能是把余額-1;它倆同時讀到了余額為0,悲劇就發生了。。。。
2.臟讀:A事務正在把userName改成‘bizi’,還沒有提交,B事務來讀取userName,得到了‘bizi’,但是A事務在修改age時拋了異常,因此回滾,結果B事務就悲劇了。。。。
3.幻讀:A事務讀了一下當前的訂單數目,B事務過來新增加了一個訂單,A事務又讀了一次訂單數,讀了兩次竟然結果不一樣,鬧鬼了。。。?
4.不可重復讀:A事務讀取了某條數據,B事務過來修改了這條數據并提交,A事務再讀的時候,就發現跟剛剛不一樣哎。。。
不可重復讀跟臟讀的區別
? ? 臟讀讀取的是未提交的數據,很有可能是無效的數據。而不可重復讀讀取的是提交之后的數據,最起碼第二次讀對了
不可重復讀跟幻讀的區別
? ? 幻讀讀的是一整條記錄,而不可重復讀針對的是某一個或幾個特定字段。

那么為了避免這種情況,數據庫就設定了幾種隔離級別,供我們使用:
1.串行化(Serializable):不允許事務并發,大家排好隊,上一個事務提交(或回滾)了,下一個事務再執行。
2.可重復讀(Repeatable-Read):同一事務前后兩次的讀,保證數據一致。意思就是:讀的時候,不允許別人寫。但是允許別人插入別的數據,因此不能避免幻讀。
3.讀已提交(Read Commited):只允許事務讀取被其他事務提交的數據。意思就是:如果當前事務是修改數據,那么不允許讀。因此避免臟讀,但是不能避免幻讀和不可重復讀。
4.讀未提交(Read Uncommitted):允許事務讀取其他事務還未提交的數據。因此上述問題都會發生。
一個表格可以說明一切(來源于@jiajialin:http://blog.csdn.net/jialinqiang/article/details/8723044):
814744-20151104165911196-1155619368.png

814744-20151104165912680-2127827621.png


來自為知筆記(Wiz)


轉載于:https://www.cnblogs.com/bishion/p/4936523.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458699.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用CppUnit進行單元測試

http://www.vckbase.com/document/viewdoc/?id1762 一、前言 測試驅動開發(TDD)是以測試作為開發過程的中心,它堅持,在編寫實際代碼之前,先寫好基于產品代碼的測試代碼。開發過程的目標就是首先使測試能夠通過,然后再優化設計結構…

錄制wav格式的音頻

項目中有面部認證、聲紋認證&#xff0c;服務器端要求上傳wav格式的音頻&#xff0c;所以寫了這樣一個小demo。 剛剛開始寫博客還不知道怎么上傳代碼&#xff0c;就復制了&#xff0c;嘻嘻 DotimeManage.h class DotimeManage; protocol DotimeManageDelegate <NSObject&g…

iOS開發網絡篇—Reachability檢測網絡狀態

前言&#xff1a;當應用程序需要訪問網絡的時候&#xff0c;它首先應該檢查設備的網絡狀態&#xff0c;確認設備的網絡環境及連接情況&#xff0c;并針對這些情況提醒用戶做出相應的處理。最好能監聽設備的網絡狀態的改變&#xff0c;當設備網絡狀態連接、斷開時&#xff0c;程…

網絡七層協議 五層模型 TCP連接 HTTP連接 socket套接字

socket&#xff08;套接字&#xff09;是通信的基石&#xff0c;是支持TCP/IP協議的網絡通信的基本操作單元&#xff0c;包含進行網絡通信必須的五種信息&#xff1a;連接使用的協議&#xff0c;本地主機的IP地址&#xff0c;本地進程的協議端口&#xff0c;遠地主機的IP地址&a…

[vs2010 project] CppUnit快速入門

簡介 測試是軟件開發過程中極其重要的一環&#xff0c;詳盡周密的測試能夠減少軟件BUG&#xff0c;提高軟件品質。測試包括單元測試、系統測試等。其中單元測試是指針對軟件功能單元所作的測試&#xff0c;這里的功能單元可以是一個類的屬性或者方法&#xff0c;測試的目的是看…

[javascript|基本概念|Number]學習筆記

Number類型的值&#xff1a;整數/浮點數值 整數 十進制 e.g.: var intNum 50; 八進制 (嚴格模式下無效,解析錯誤)字面值首位必須是0,之后的數字序列為0&#xff5e;7 e.g.: var intNum 070; //解析為十進制56 (如果字面值數值超出了范圍&#xff0c;前導0將被忽略&#xf…

[轉]深入理解linux內核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux內核list_head的實現 2012-07-17 17:37:01 分類&#xff1a; LINUX 前言&#xff1a;在linux源代碼中有個頭文件為list.h。很多linux下的源代碼都會使用這個頭文件&#xff0c;它里面定義 了一個結構,以及…

xcode左側不顯示工程文件目錄,提示NO Filter Results

解決辦法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技術雜談005】如何與程控儀器通過GPIB接口進行通信

在工控測試系統中&#xff0c;經常需要使用到各類程控儀器&#xff0c;這些程控儀器通常具有GPIB、LAN、USB等硬件接口&#xff0c;計算機通過這些接口能夠與其通信&#xff0c;從而實現自動測量、數據采集、數據分析和數據處理等操作。本文主要介紹如何與程控儀器通過GPIB接口…

標題在上邊框中的html(fieldset標簽)

<fieldset> <legend>標題</legend> 內容 </fieldset> 轉載于:https://www.cnblogs.com/lswbk/p/4952820.html

移除項目中的CocoaPods

在項目中移除CocoaPods cocoaPods雖然很方便&#xff0c;但是我是真心的不喜歡用它&#xff0c;總是出錯如果你覺得CocoaPods讓你的項目出現了問題&#xff0c;不好用甚至是惡心&#xff0c;想將其從項目中徹底移除&#xff0c;也有方法&#xff1a; 1.刪除工程文件夾下的Podf…

ShellExecute使用詳解

有三個API函數可以運行可執行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因為使用復雜&#xff0c;比較少用。 2.WinExec主要運行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不僅可以運行EXE文件&#xff0c;也可以運行…

javascript筆記整理(對象基礎)

一、名詞解釋 1.基于對象&#xff08;一切皆對象&#xff0c;以對象的概念來編程&#xff09; 2.面向對象編程(Object Oriented Programming&#xff0c;OOP) A.對象(JavaScript 中的所有事物都是對象) B.對象的屬性和行為 屬性:用數據值來描述他的狀態 行為:用來改變對象行為的…

java的安裝和配置

JRE (JAVA Runtime Enviroment java運行環境),包括JVM(java虛擬機)和java程序所需的核心功能類庫&#xff0c;如果只是運行java程序&#xff0c;只需安裝JRE。 JDK &#xff08;Java Development Kit 開發工具包&#xff09;包括開發JAVA程序時所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 靈活使用#ifdef指示符&#xff0c;我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。 代碼舉例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安裝 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html轉載于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC對話框最小化到托盤

1、在資源中的Icon中導入一個自己喜歡的圖標&#xff0c;ID命名為IDR_MAINFRAME&#xff0c;將先前的IDR_MAINFRAME的圖標刪除掉&#xff1b; 2、在自己的Dialog頭文件中定義一個變量 NOTIFYICONDATA m_nid&#xff0c;關于該結構體的具體信息可以查閱MSDN&#xff1b; 3、添加…

Android acache讀后感

今天了解到了一個android輕量級的開源緩存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一點時間研究了一下源代碼&#xff0c;大概的思路就是每個緩存目錄對應一個Acache類&#xff0c;通過mInstanceMap關聯&#xff08;個人覺得這個主要是減少對…

continue break

塊作用域 一個塊或復合語句是用一對花括號&#xff08;"{}"&#xff09;括起來的任意數量的簡單的java語句。塊定義了變量的作用范圍。 1、嵌套塊是方法內的嵌套&#xff0c;不包括類的花括號。在嵌套塊內的 變量是不可以重復定義的。 2、不允許重復定義的是局部變…

GetVersionEx 獲取系統版本信息

轉自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上獲取系統版本信息需要調用系統API&#xff0c;于是用到了GetVersionEx。 首先看一看函數原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…