1. 程式人生 > >資料庫事務的四大特性(ACID)及事務的隔離級別

資料庫事務的四大特性(ACID)及事務的隔離級別

事務具有4大特性,一般稱為事務的ACID屬性

原子性

事務是一個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行,在操作失敗後不能對資料庫中的資料有任何影響。

一致性:

在事務開始和完成時,資料必須保持一致狀態,這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性;事務結束時,所有的內部資料結構也必須是正確的。

隔離性:

資料庫系統提供一定的隔離級別,保證事務在不受外部併發操作影響的“獨立”環境執行。這意味著事務處理過程中的中間狀態對外部是不可見的,反之亦然(注意:事務的隔離性是相對於兩個事務而說的,兩個事務獨立執行互補干擾)。

永續性:

事務完成後,它對資料的修改是永久的,即使出現系統故障也能保持的正確性。

在多個執行緒開啟併發事務處理時,如果不考慮事務的隔離性,可能帶來的問題:

髒讀:

一個事務正在對一條記錄做修改,在這個事務完成並提交前,這條資料就會處於一個不一致的狀態 ,這時候另一個事務也來讀取同一條記錄,如果不加控制,第二個事務就讀取了這些“髒資料”。簡單的點說:一個事務在處理過程中讀取了另一個事務中未提交的資料。

如:使用者A向用戶B轉賬100元,對應SQL命令如下:

update account set money=money+100 where name=’B’; (此時A通知B)

update account set money=money - 100 where name=’A’;

當只執行第一條SQL時,A通知B檢視賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次檢視賬戶時就會發現錢其實並沒有轉。

不可重複讀:

一個事務在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現這些資料已經發生了改變或者某些記錄已經被刪除了,返回了和之前返回不同的資料值。

如:事務T1在讀取某一資料,而事務T2立馬修改了這個資料並且提交事務給資料庫,事務T1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。

幻讀:

一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料。

如:事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

不可重複讀和幻讀的共同點是都是讀取已經提交的資料,不同的是不可重複讀是兩個事務讀取的同一條資料發現不同,而幻讀是兩條或者多條資料之間的問題。

資料庫實現隔離級別的方式有兩種:

在讀取資料之前,對其加鎖,阻止其他事務對資料進行修改;

不加鎖,利用資料庫提供的機制來避免這些問題的發生。

MySQL在處理事務隔離和併發之間的矛盾上提供了四種事務的隔離級別:

未提交讀(Read uncommitted):

最低級別,只能保證不讀取物理上損壞的資料。兩個事務,其中一個事務對資料做的DML操作還未提交,另一個事務能夠立即看到。

如:老闆給我發工資,先給我打了1W,還沒提交事務,我發現賬上已經有1W了,後面老闆反悔了,說發多了,又更新為5K,我想買個iphone6s,發現錢不夠了。

這樣會產生嚴重的髒讀,因為修改的事務也許在提交前還會有其他的很多修改,所以另一個事務的資料讀取會錯亂。

已提交讀(Read committed):

可以避免髒讀的發生,是語句級別的。兩個事務,其中一個事務對資料做的DML操作提交後,另一個事務才能看到。

如:還是上面的例子,老闆給我打錢,中間反悔了不算,只有在最後確認了,最終發給我5K,那麼我才能夠看到賬戶裡多了5K。

這避免了上面髒讀的問題,但是這樣還是會產生不可重複讀,意思是兩個事務同時開啟,事務A讀取資料後,事務B對資料進行修改後提交,事務A再次讀取,會發現跟前一次讀取的內容不一樣了。

可重複讀(Repeatable read):

可以避免髒讀和不可重複讀的發生,是事務級別的。兩個事務,其中事務A獲取一條資料,事務B在事務A提交事務前無法操作這條資料,這樣就保證了可以重複讀。(即資料庫加了讀鎖)

如:A讀取一條資料,給它加鎖,B無法修改這條資料;但是B可以往表中插入、刪除資料。

避免了上面的問題,但是這樣還是會產生幻讀現象,意思是兩個事務同時開啟,事務A全表更新未提交事務,事務B做了插入操作提交,事務A在事務中發現全表更新並沒有成功。

可序列化(Serializable):

最高級別,事務級別,可避免髒讀、不可重複讀、幻讀的發生。兩個事務完全獨立,其中一個事務做的操作,對於另外一個事務不產生任何影響。(資料庫事務加了鎖,所有事務序列執行)

可以避免上述所有問題,但是效能上影響很大。

以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。

在MySQL資料庫中,支援上面四種隔離級別,預設的為Repeatable read (可重複讀);而在Oracle資料庫中,只支援Serializable (序列化)級別和Read committed (讀已提交)這兩種級別,其中預設的為Read committed級別

在MySQL資料庫中檢視當前事務的隔離級別的語句:

select @@tx_isolation;

在MySQL資料庫中設定事務的隔離級別的語句:

set [glogal | session] transaction isolation level 隔離級別名稱;

set tx_isolation=’隔離級別名稱;

注意:

設定資料庫的隔離級別一定要是在開啟事務之前!如果是使用JDBC對資料庫的事務設定隔離級別的話,也應該是在呼叫Connection物件的setAutoCommit(false)方法之前。呼叫Connection物件的setTransactionIsolation(level)即可設定當前連結的隔離級別。

隔離級別的設定只對當前連結有效。對於使用MySQL命令視窗而言,一個視窗就相當於一個連結,當前視窗設定的隔離級別只對當前視窗中的事務有效;對於JDBC操作資料庫來說,一個Connection物件相當於一個連結,而對於Connection物件設定的隔離級別只對該Connection物件有效,與其他連結Connection物件無關

相關推薦

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

事務具有4大特性,一般稱為事務的ACID屬性: 原子性: 事務是一個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行,在操作失敗後不能對資料庫中的資料有任何影響。 一致性: 在事務開始和完成時,資料必須保持一致狀態,這意味著所有相關的資料規則都必須應用於事務

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

如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)   原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾      因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影

事務管理中的四大特性ACID以及隔離級別和傳播行為

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

資料庫事務特性ACID

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

oracle事務的四個特性ACID

失敗 會話 狀態 服務 可能 ccf 保持 16px 其他 事務產生的背景 當在PL/SQL中同時操作多個SQL語句,比如通過DML語句添加、修改或刪除數據時,如何確保數據庫數據不會因為意外而倒置錯誤數據是一個非常重要的問題。 以倉庫發料系統為例,如果某一張領料單已經領

新架構資料庫.db檢視方式原創 Linux sqlite3基本命令轉載

檢視新架構.db檔案有有兩種形式: 1.可以使用客戶端檢視.db資料庫檔案,總共用過的有以下三個(個人軟體中有) 先telnet進裝置,下載ZKDB.db資料庫檔案,再使用下面這三個資料庫檢視 sqliteadmin SQLiteSpy SQLite Expert Prof

mysql 事物的4大特性ACID+事物的開啟與關閉

原子性: 即整個事物是一個整體,要麼這個事物全部執行成功,要麼全部失敗一致性: 即事物執行狀態結果 與 原資料形成統一。例如轉賬,總金額是不變的隔離性: 在併發事物中,隔離開不能互相影響,但是也不能完全隔離,會降低效率永續性:如果執行成功,資料庫崩潰,如果重新啟動,資料庫已經

事務學習總結2——spring事務

一、spring事務:       spring針對事務的解決方案,在基礎的隔離性基礎上,又增加了事務傳播行為、只讀事務、事務超時的機制。 二、事務傳播:       其實就是兩個事務傳播。     &n

Spring 事務學習筆記1事務的基本知識

一、事務&&JDBC事務支援 在我的之前的spring操作資料庫中的文章很少提及事務,不是說它不重要,而是太重要,以至於spring專門有一部分來說明這一內容。之前可以說對事務幾乎沒有考慮過,只是知道把要進行的操作被事務包裹起來,就像在hibernate中進

資料庫事務四大特性事務隔離級別在mysql中的具體體現

事務的四大特性 原子性 指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 一致性 指事務必須使資料庫從一個一致性狀態轉換到另一個一致性狀態。拿轉賬來說,不管如何轉賬,錢的總數不變。 隔離性 指多個使用者訪問資料庫時,使用者為每個資

Mysql事務詳解事務的概念,四大特性,使用和回滾

以往的時候在java中,下面一個語句就可以操作一條資料庫語句<span style="font-family: Arial, Helvetica, sans-serif;">Class.forName("com.mysql.jdbc.Driver");//載入相

資料庫事務四大特性————ACID

ACID-----A:Atomicity -原子性     C:Consistency -一致性     I:Isolation -隔離性    D:Durability - 永續性事務:事物(transaction)是由一些列操作序列構成的執行單元,這些單元要麼都做,要麼不

資料庫事務四大特性ACID

事務的4大特性(ACID): 原子性(Atomicity): 事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。 一致性(Consistemcy): 事務前後,資料庫的

資料庫事務的四個基本性質ACID

資料庫事務概念 什麼是資料庫事務? 事務(transaction)是由指邏輯上對資料的的一組操作, 這組操作要麼一次全部成功,如果這組操作全部失敗,是不可分割的一個工作單位。 資料庫事務的四個基本性質(ACID) 1. 原子性(Atomicity) 事務的原子性

Spring事務處理時自我調用的解決方案一些實現方式的風險

上下 喜歡 wire print type service() str bug 銷毀 轉:http://www.iteye.com/topic/1122740 預備知識 測試代碼準備 問題 解決方案 1通過ThreadLocal暴露Aop代理對象 2通過初始化方法在目標對

python事務四大特性ACID

完成 所有 特性 事務提交 失敗 數據庫 原子性 數據操作 允許 1.原子性 整個事務中的所有操作要麽全部提交成功,要麽全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作 2.一致性 一致性就是在沒有提交事務前,不管理對數據操作多少次,真實的數據都不會改動,只有提

MyBatis的學習——MyBatis事務核心物件配置

一、獲取SqlSession物件 MyBatis框架中涉及到的幾個API SqlSessionFactoryBuilder:該物件負責根據MyBatis配置檔案mybatis-config.xml構建SqlSessionFactory例項  負責生產session SqlSes

Qt連線MySQL程式設計資料庫效能調優

之前整理過一篇Qt下資料庫程式設計基礎 :最近在進行單元測試,所以把遇到的一些問題整理出來,主要是關於資料庫的 1.遠端連線資料庫 連線語句是: mysql -h 192.168.xx.xx(IP地址) -P 3306(埠) -u remoteuser(登入使用

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

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

mongodb4.0事務特性解讀

mongodb4.0即將推出,最大的亮點莫過於,開始支援‘真正的’事務了。為什麼說是真正的呢?之前的行級別原子性,兩階段提交,要麼應用場景有限,要麼實現成本太高,有點‘雞肋’。 大年三十的時候,mongodb的CTO兼聯合創始人Eliot Horowitz就發文給大家介紹了m