1. 程式人生 > >簡單介紹一下資料庫事務的特性,重點介紹隔離級別

簡單介紹一下資料庫事務的特性,重點介紹隔離級別

本篇講一下資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。

⑴ 原子性(Atomicity)

 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

⑵ 一致性(Consistency)

  一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

  舉個簡單的栗子,拿轉賬來說,假設使用者A和使用者B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。

⑶ 隔離性(Isolation)

  隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,每個不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。

關於事務的隔離性資料庫提供了多種隔離級別,下面會重點介紹。

⑷ 永續性(Durability)

  永續性是指一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

  例如我們在使用JDBC操作資料庫時,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。

重點說一下事務的隔離性

如果沒有事務的隔離性容易出現的情況: 1.髒讀:  在一個事務中讀到另一個事務未提交的更新資料。 2.不可重複讀:  在一個事務中讀到了另一個事務提交的更新資料化。針對記錄的(即一行),在一個事務中同一條記錄前後讀到的資料不一致。簡單說就是同一個事務內前後讀兩次資料,第二次有可能會讀到其他事務提交過來的更新資料,造成前後兩次讀的資料不一致。舉個例子,就是第一次
讀的時候,另外一個事務還沒提交,但是第二次讀的時候另外一個事務的更新資料提交了,而且提交的資料被你這個事務讀到了,就造成了前後兩次讀到的資料不一致。正常情況下只要在我這個事務內,不管什麼時候讀資料都應該一致,不應該受其他事務的影響 3.虛讀(幻讀): 在一個事務中讀到了另一個事務提交的新插入資料。如果符合搜尋條件的一行資料在後面的讀取操作中出現,但該行資料卻不屬於最初的資料,就會發生這種事件。(加顏色部分是官方的解釋)。下邊是自己的理解:虛度針對表的,在同一個事務中用相同的搜尋條件查同一張表的數據,比如第一次查到5條,但是第二次再用相同的查詢條件去查,查到了6條,前後讀到的記錄數不一致,這就是虛度也叫幻讀 關於髒讀、不可重複讀和幻讀的個人理解:髒讀是在一個事務中讀到了另一個事務未提交的更新資料;不可重複讀是在一個事務中讀到了另一個事務提交的更新資料;幻讀是在一個事務中讀到了另一個事務提交的新插入資料。不管是哪種情況都是一個正在進行中的事務受到了別的事務的影響。 針對這些容易出現的問題,資料庫設定了對應的事務隔離級別 1.未提交讀(read uncommitted):會出現髒讀、不可重複讀和幻讀,級別最低 2.提交讀(read committed):會出現不可重複讀和幻讀。oracle的預設事務隔離級別,也是大多數資料的預設級別 3.可重複讀(repeatable read):會出現幻讀,mysql預設級別 4.序列化(serializable):隔離級別最高,不允許出現髒讀、不可重複讀和幻讀。即一個事務執行結束了另一個事務才能執行,類似於Java中的synchronized加鎖,因為是序列化的,所以在併發時效能也最差。 說明:雖然序列化是最安全的,但是現實生產環境中不一定都設定成這個級別,因為雖然是最安全的,但是效率和性能不好。設定什麼樣的隔離級別比較合適得根據具體的業務需求定,不一定級別最高的就是最好的。 如果資料庫設定的隔離級別不滿足當前的業務需求時,你可以適當的修改,當然也可以不修改整個資料庫的事務隔離級別,用Java程式碼來控制當前業務需求中的事務隔離級別。 Java中設定資料事務的隔離級別 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); conn.setAutoCommit(false);//開啟事務

其中Connection.TRANSACTION_READ_COMMITTED只是隔離級別中的一個只是舉個例子,其他的三種級別,java中也有對應的常量

注意:設定事務的隔離級別一定要在開啟事務之前進行設定

總結:上邊是自己對資料庫以及事務和隔離級別的一些簡單的理解,供大家參考,若有錯誤的地方希望大家包涵並及時指出,3Q~


相關推薦

spring的4種事務特性5種隔離級別7種傳播行為

spring事務: 什麼是事務: 事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗. 事務特性(4種): 原子性 (atomicity):強調事務的不可分割. 一致

Spring的四種事務特性五種隔離級別七種傳播行為

Spring事務:什麼是事務:事務邏輯上的一組對資料對操作,組成這些操作的各個邏輯單元,要麼一起成功,要麼一起失敗。事務特性(4種):原子性(atomicity):強調事務的不可分割;一致性(consistency):事務的執行前後資料的完整性保持一致;隔離性(isolati

資料庫事務特性、併發、隔離級別、鎖種類、鎖粒度

本文解釋資料庫併發控制 事務 對資料庫資料執行的一系列操作,可以是一條或者多條SQL語句 資料庫事務特性 1、 原子性 對資料庫資料的一系列操作,要麼全部執行,要麼都不

簡單介紹一下資料庫事務特性重點介紹隔離級別

本篇講一下資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。 ⑴ 原子性(Atomicity)  原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成

網絡協議 finally{ return問題 註入問題 jdbc註冊驅動問題 PreparedStatement 連接池目的 1.2.1DBCP連接池 C3P0連接池 MYSQL兩種方式進行實物管理 JDBC事務 DBUtils事務 ThreadLocal 事務特性 並發訪問 隔離級別

ID -- 1.7 ner red style 沒有 建立 工具 1.1.1 API詳解:註冊驅動 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用 原因有2個: >導致驅動被註冊2次。 &

資料庫事務ACID和四個隔離級別

在實際的業務場景中,併發讀寫引出了和事務控制的需求。優秀的事務處理能力是關係型資料庫(特別是oracle等商用RDBMS)相對於正當風口的NoSQL資料庫的一大亮點。但這也從另一方面說明了事務控制的複雜性——正因為過於複雜,大部分NoSQL都沒提供事務支援或只提供部分事務支援

spring的4種事務特性、4種隔離級別、7種傳播行為

1.事務概念事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。2.事務特性(4種)事務特性分為四個:原子性(Atomi

資料庫事務特性(ACID)

I.事務的4大特性(ACID) 原子性(Atomicity):原子性是指事務是一個不可分割的工作單位,事務中的操作要麼全部成功,要麼全部失敗。 一致性(Consistency):事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。 隔離性(Isol

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

一 、事務的四大特性 如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性(ACID): 1. 原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的

事務有哪些特性?spring的事務管理有幾種方式實現如何實現?spring 中常用的兩種事務配置方式以及事務的傳播性、隔離級別

事務有哪些特性?             1.原子性:一個事務中所有對資料庫的操作是一個不可分割的操作序列,要麼全做要麼全不做            2.一致性:資料不會因為事務的執行而遭到破壞            3.隔離性:一個事物的執行,不受其他事務的干擾,即併發執

資料庫事務隔離級別

注意:我們討論隔離級別的場景,主要是在多個事務併發 的情況下,因此,接下來的講解都圍繞事務併發。Read uncommitted 讀未提交公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去檢視賬戶,發現工資已經到賬,是5000元整,非常高 興。可是不幸的是,領導發現發

Spring事務的7個傳播行為4個隔離級別

Spring事務的傳播行為和隔離級別[transaction behavior and isolated level] Spring中事務的定義:  一、Propagation  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是

資料庫事務 ACID屬性、資料庫併發問題和四種隔離級別

# 資料庫事務 ACID屬性、資料庫併發問題和四種隔離級別 ## 資料庫事務 #### 資料庫事務是一組邏輯操作單元,使資料從一種狀態變換到另一種狀態 > 一組邏輯操作單元;一個或多個DML操作 #### 事務處理原則 > 保證所有事務都作為一個工作單元來執行,即使出現故障,都不能改變這種執行方式。

淺析事務的傳播行為與隔離級別

七個傳播行為,四個隔離級別。 Spring中事務的定義:Propagation(key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。)有以下選項可供使用: PROPAGATION_REQUIRED–支援當前事務,如果當前沒有事務,就

spring事務管理(一) 隔離級別、傳播行為

1.事務的定義 事務是指多個操作單元組成的合集,多個單元操作是整體不可分割的,要麼都操作不成功,要麼都成功。其必須遵循四個原則(ACID)。 原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全不做; 一致性(Consistency

事物的四個特性和四個隔離級別

什麼事物 事物是一條或者多條sql語句組成的執行序列,這個序列中的所有語句都屬於同一個工作單元,要麼同時完成,其中如果有一個失敗,則其他操作都要回滾。 原子性 (Atomicity) 事物是一個不可分割的資料庫邏輯工作單位,要麼全部完成,要不失敗回滾。

Spring事務的傳播行為、隔離級別、回滾、只讀和過期

事務的傳播性- 當事務的方法被另一個事務的方法呼叫時,必須指定事務應該如何傳播。如:方法可能繼續在現有的事務中執行,也可能開啟一個新的事務,並在自己的事務中執行。- 事務的傳播行為可以由傳播屬性指定。Spring定義了7種傳播行為:required:如果有事務在執行,當前的方

事務的傳播行為和隔離級別

隔離級別:read-uncommit : 會出現幻讀,髒讀, 不可重複讀read-commit(預設隔離級別): 會出現幻讀, 不可重複讀repeatable-read : 會出現幻讀serializable : 最安全花費最高的級別 ,每次讀寫都加鎖傳播行為:require

spring 中常用的兩種事務配置方式以及事務的傳播性、隔離級別

在前面的文章中總結了spring事務的5中配置方式,但是很多方式都不用而且當時的配置使用的所有引數都是預設的引數,這篇文章就看常用的兩種事務配置方式並資訊配置事務的傳播性、隔離級別、以及超時等問題,廢話不說下面就來看看! 一、註解式事務 1、註解式事務在平時的開發中使用的挺