1. 程式人生 > >資料庫事務與隔離級別,事物邊界

資料庫事務與隔離級別,事物邊界

1.資料庫事務的概念:

•事務是指一組相互依賴的操作行為,如銀行交易、股票交易或網上購物。事務的成功取決於這些相互依賴的操作行為是否都能執行成功,只要有一個操作行為失敗,就意味著整個事務失敗。例如,Tom到銀行辦理轉賬事務,把100元錢轉到Jack的賬號上,這個事務包含以下操作行為:

–(1)從Tom的賬戶上減去100元。

–(2)往Jack的賬戶上增加100元。

•顯然,以上兩個操作必須作為一個不可分割的工作單元。假如僅僅第一步操作執行成功,使得Tom的賬戶上扣除了100元,但是第二步操作執行失敗,Jack的賬戶上沒有增加100元,那麼整個事務失敗。

•資料庫事務是對現實生活中事務的模擬,它由一組在業務邏輯上相互依賴的SQL語句組成

2.資料庫事務的生命週期:

3.宣告事務的邊界:

•事務的開始邊界。

•事務的正常結束邊界(COMMIT):提交事務,永久儲存被事務更新後的資料庫狀態。

•事務的異常結束邊界(ROLLBACK):撤銷事務,使資料庫退回到執行事務前的初始狀態。

(1).在MySQL.exe中宣告事務:

•每啟動一個mysql.exe程式,就會得到一個單獨的資料庫連線。每個資料庫連線都有個全域性變數@@autocommit,表示當前的事務模式,它有兩個可選值:

–0:表示手工提交模式。

–1:預設值,表示自動提交模式。

•如果要察看當前的事務模式,可使用如下SQL命令:

–mysql> select @@autocommit


•如果要把當前的事務模式改為手工提交模式,可使用如下SQL命令:

–mysql> set autocommit=0;

——在自動提交模式下提交事務:

•在自動提交模式下,每個SQL語句都是一個獨立的事務。如果在一個mysql.exe程式中執行SQL語句:

–mysql>insert into ACCOUNTS values(1,'Tom',1000);

•MySQL會自動提交這個事務,這意味著向ACCOUNTS表中新插入的記錄會永久儲存在資料庫中。此時在另一個mysql.exe程式中執行SQL語句:

–mysql>select * from ACCOUNTS;

•這條select語句會查詢到ID為1的ACCOUNTS記錄。這表明在第一個mysql.exe程式中插入的ACCOUNTS記錄被永久儲存,這體現了事務的ACID特性中的永續性。

——在手工模式下提交事務:

•在手工提交模式下,必須顯式指定事務開始邊界和結束邊界:

–事務的開始邊界:begin

–提交事務:commit

–撤銷事務:rollback

例:

–mysql>begin;
–mysql>select * from ACCOUNTS;
–mysql>commit;

(2).通過JDBC API宣告事務邊界:

• Connection提供了以下用於控制事務的方法:

–setAutoCommit(boolean autoCommit):設定是否自動提交事務

–commit():提交事務

–rollback():撤銷事務

例:

try {

con = Java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);

//設定手工提交事務模式

con.setAutoCommit(false);

stmt = con.createStatement();

//資料庫更新操作1

stmt.executeUpdate("update ACCOUNTS set BALANCE=900 where ID=1 ");

//資料庫更新操作2

stmt.executeUpdate("update ACCOUNTS set BALANCE=1000 where ID=2 ");

con.commit(); //提交事務

}catch(Exception e) {

try{

con.rollback(); //操作不成功則撤銷事務

}catch(Exception ex){

//處理異常

……

}

//處理異常

……

}finally{…}

(3).通過hibernate API宣告事務邊界:

•宣告事務的開始邊界:Transaction tx=session.beginTransaction();

•提交事務: tx.commit();

•撤銷事務: tx.rollback();

4.多個事務併發時的併發問題:

第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新資料覆蓋。

髒讀:一個事務讀到另一事務未提交的更新資料。

虛讀:一個事務讀到另一事務已提交的新插入的資料。

不可重複讀:一個事務讀到另一事務已提交的更新資料。

第二類丟失更新:這是不可重複讀中的特例,一個事務覆蓋另一事務已提交的更新資料。

以取款事務和支票轉賬事務例:

•取款事務包含以下步驟:

–(1)某銀行客戶在銀行前臺請求取款100元,出納員先查詢賬戶資訊,得知存款餘額為1000元。

–(2)出納員判斷出存款額超過了取款額,就支付給客戶100元,並將賬戶上的存款餘額改為900元。

•支票轉賬事務包含以下步驟:

–(1)某出納員處理一轉帳支票,該支票向一帳戶匯入100元。出納員先查詢賬戶資訊,得知存款餘額為900元。

–(2)出納員將存款餘額改為1000元。

併發執行的兩個事務導致髒讀:

取款事務在T5時刻把存款餘額改為900元,支票轉賬事務在T6時刻查詢賬戶的存款餘額為900元,取款事務在T7時刻被撤銷,支票轉賬事務在T8時刻把存款餘額改為1000元。

由於支票轉賬事務查詢到了取款事務未提交的更新資料,並且在這個查詢結果的基礎上進行更新操作,如果取款事務最後被撤銷,會導致銀行客戶損失100元。

併發執行的兩個事務導致第二類更新丟失:

取款事務在T5時刻根據在T3時刻的查詢結果,把存款餘額改為1000-100元,在T6時刻提交事務。支票轉賬事務在T7時刻根據在T4時刻的查詢結果,把存款餘額改為1000+100

元。由於支票轉賬事務覆蓋了取款事務對存款餘額所做的更新,導致銀行最後損失100元。

5.資料庫的隔離級別:

(1).隔離級別與併發效能的關係:

(2).設定隔離級別的原則:

•隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。

•對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為Read Committed,它能夠避免髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、虛讀

和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖樂觀鎖來控制。

(3)在mysql.exe程式中中設定隔離級別:

•每啟動一個mysql.exe程式,就會獲得一個單獨的資料庫連線。每個資料庫連線都有個全域性變數@@tx_isolation,表示當前的事務隔離級別。MySQL預設的隔離

級別為Repeatable Read。如果要察看當前的隔離級別,可使用如下SQL命令:

–mysql> select @@tx_isolation;

•如果要把當前mysql.exe程式的隔離級別改為Read Committed,可使用如下SQL命令:

–mysql> set transaction isolation level read committed;

(4)在Hibernate中設定隔離級別:

•在Hibernate的配置檔案中可以顯式的設定隔離級別。每一種隔離級別都對應一個整數:

–1:Read Uncommitted

–2:Read Committed

–4:Repeatable Read

–8:Serializable

•例如,以下程式碼把hibernate.cfg.xml檔案中的隔離級別設為Read Committed:

hibernate.connection.isolation=2

對於從資料庫連線池中獲得的每個連線,Hibernate都會把它改為使用Read Committed隔離級別。

相關推薦

資料庫事務隔離級別事物邊界

1.資料庫事務的概念: •事務是指一組相互依賴的操作行為,如銀行交易、股票交易或網上購物。事務的成功取決於這些相互依賴的操作行為是否都能執行成功,只要有一個操作行為失敗,就意味著整個事務失敗。例如,Tom到銀行辦理轉賬事務,把100元錢轉到Jack的賬號上,這個事務包含以

資料庫的四大特性以及事務隔離級別七種傳播行為

資料庫的四大特性: 1.原子性 2.一致性 3.隔離性 4.永續性 其中不考慮事務的隔離性會出現下面幾種情況: (1)髒讀 在一個事務處理過程裡讀取了另一個未提交的事務中的資料。 當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併

資料庫事務隔離級別(重點不可重複讀和可重複度的區別)

資料庫事務的四個特性(ACID) 1 、原子性 (Atomicity) 事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做 2 、一致性 (Consistency) 事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。

事務隔離級別加鎖的細節以及兩者之間的關係。 同時也說明了 索引 鎖 之間的關係以及死鎖成因的簡化的情況

背景 MySQL/InnoDB的加鎖分析,一直是一個比較困難的話題。我在工作過程中,經常會有同事諮詢這方面的問題。同時,微博上也經常會收到MySQL鎖相關的私信,讓我幫助解決一些死鎖的問題。本文,準備就MySQL/InnoDB的加鎖問題,展開較為深入的分析與討論,

事務隔離級別筆記

講解 三種 span http ont nbsp 隔離 server bsp SQL Server 2008 R2 事務與隔離級別實例講解 筆記 1、事務是數據庫的工作單元,可視為一個原子操作,要麽成功,要麽什麽也不曾發生   事務操作的三種命令:     a、     事

事務隔離級別------《Designing Data-Intensive Applications》讀書筆記10

串行化 clas block atomic 硬件故障 nsis 特性 筆記 額外 和數據庫打交道的程序員繞不開的話題就是:事務,作為一個簡化訪問數據庫的應用程序的編程模型。通過使用事務,應用程序可以忽略某些潛在的錯誤場景和並發問題,由數據庫負責處理它們。而並非每個應用程序

4種事務隔離級別InnoDB怎樣巧妙實現?

事務ACID特性,當中I代表隔離性(Isolation)。   什麼是事務的隔離性? 隔離性是指,多個使用者的併發事務訪問同一個資料庫時,一個使用者的事務不應該被其它使用者的事務干擾。多個併發事務之間要相互隔離。   一個事

【 58沈劍 架構師之路】4種事務隔離級別InnoDB如何巧妙實現?

事務ACID特性,其中I代表隔離性(Isolation)。   什麼是事務的隔離性? 隔離性是指,多個使用者的併發事務訪問同一個資料庫時,一個使用者的事務不應該被其他使用者的事務干擾,多個併發事務之間要相互隔離。   一個事務怎麼會干擾其他事務呢? 咱們舉例子來說明,假設有In

【 58沈劍 架構師之路】4種事務隔離級別InnoDB如何巧妙實現?

事務ACID特性,其中I代表隔離性(Isolation)。   什麼是事務的隔離性? 隔離性是指,多個使用者的併發事務訪問同一個資料庫時,一個使用者的事務不應該被其他使用者的事務干擾,多個併發事務之間要相互隔離。   一個事務怎麼會干擾其他事務呢? 咱們舉

幾種事務隔離級別InnoDB如何實現?

事務ACID特性,其中I代表隔離性(Isolation)。 什麼是事務的隔離性? 隔離性是指,多個使用者的併發事務訪問同一個資料庫時,一個使用者的事務不應該被其他使用者的事務干擾,多個併發事務之間要相互隔離。 一個事務怎麼會干擾其他事務呢? 咱們舉例子來說明,假設有InnoDB表: t(id PK, na

資料庫事務隔離級別和傳播屬性

√: 可能出現    ×: 不會出現 髒讀 不可重複讀 幻讀 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我們討論隔離級別的場景,主要是在多個事務併發的情況下,因此,接下

Spring的傳播行為隔離級別你必須懂的

Spring事務中的傳播行為如下: Require:支援當前事務,如果沒有事務,就建一個新的,這是最常見的; Supports:支援當前事務,如果當前沒有事務,就以非事務方式執行; Mandatory:支援當前事務,如果當前沒有事務,就丟擲異常; Requires

資料庫事務以及隔離級別

一、首先什麼是事務? 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事務的結束有兩種,當事務中所有步驟全部成功執行時,事務提交。如果

資料庫事務隔離級別

資料庫事物是指單個邏輯工作單元的一系列操作,要麼完全執行,要麼完全不執行。事物隔離保證了在併發操作過程中互相 干擾,同時,事物提供了從錯誤中恢復的方法。 事物有四個特性:原子性、一致性、隔離性、永續性。 髒讀:指一個事物A讀取到另一個事物B尚未提交的資料。若事物

資料庫事務隔離級別、鎖、封鎖協議的理解及其關係的理解

前言 寫篇文章來鞏固自己學習的知識。通過寫文章,本著一顆不誤導別人、不混過去的心,找出那些自己看似懂了的問題。這篇文章主要講的是事務、隔離級別、鎖、封鎖協議之間的關聯。我覺得最重要的是要將這些知識關聯起來。而不是單獨的去理解。 在這裡提一個問題。在瞭解一級封

SQL Server 事務隔離級別

上班途中,你在一處ATM機前停了下來。正當你在敲入密碼的時候,你的一位家人也正在鎮上的另一處TAM機上輸入密碼。你打算從某個還有500元餘額的賬戶上轉出400元,而你的家人想從同一賬戶取走300元。倘若沒有隔離級別的存在,麻煩就要來了......SQL Server 實現了

MySQL資料庫事務隔離級別加鎖情況--read committed && MVCC

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

SQL Server 之 事務隔離級別實例講解

數據 potential ola sed http 高可用 獲取 簡介 set 原文:SQL Server 之 事務與隔離級別實例講解   SQL Server 實現了6個隔離級別來防止並發情況下,類似企圖並發的訪問或修改同一數據時問題的發生。本文將帶你體驗全部6個隔

資料庫事務隔離級別及四大特性

在我們瞭解資料庫隔離級別前先來回顧一下資料庫讀資料時可能遇到的問題: (1)髒讀 一個事務對資料進行更新操作,但還完成,此時另一事務讀取該資料,如果此時第一個事務由於操作失敗進行了回滾,那麼此時另外事務讀取的資料就是髒資料。 (2)不可重複讀 例如事務A在讀取某一資料,而事務B立馬修改了這個資料並且提交事務給