在寫之前交代一下背景吧!
做開發也好久了,沒怎麼整理過知識,現在剖析一下自己對資料庫事務的認識,以前用sqlserver,現在轉j**a後又用mysql、oracle。我這塊就主要解釋一下mysql資料庫事務。其實好多內容適用於各種標準資料庫!
直接就進入正文了!
不管是做啥都有理論知識,我在這塊也介紹一下。
1.原子性(atomicity):原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
2.一致性(consistency):在乙個事務中,事務前後資料的完整性必須保持一致,可以想象銀行轉賬、火車購票。
3.隔離性(isolation):多個事務,事務的隔離性是指多個使用者併發訪問資料庫時, 乙個使用者的事務不能被其它使用者的事務所干擾,多個併發事務之間資料要相互隔離。
4.永續性(durability):永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
寫這些概念呢,是有點繞!繞就繞吧!反正也不是我規定的,這是官方的,解釋是我編的!!!
如果我們在不考慮隔離性問題時,事務是存在三種併發訪問問題的。
1.髒讀:在乙個事務中,當讀取資料時,讀到了另乙個事務未提交的資料。
比如a賬戶給b賬戶轉了1塊錢,但是a沒有提交事務,被b賬戶通過髒讀看到了,這時,b就會以為a已經把錢轉過來了,但是這時,a賬戶回滾事務。其實錢就沒給b轉過去,但是b自己本身以為a已經轉過去了,,,有點繞,估計是我描述到繞!
看**:
update account set money=money+1 where name=』b』; --此時a去通知b2.不可重複讀:在乙個事務中,兩次讀取的資料內容不一致,這是因為在查詢時,有時間間隔,資料被另乙個事務已經修改提交了,那就會出現問題。update account set money=money -1 where name=』a』;
3.幻讀/虛讀:在乙個事務中,兩次讀取的資料量不一致。
上面介紹了3種事務併發問題!現在介紹一下資料庫提供的解決方案!
1.read uncommitted : 讀取尚未提交的資料 :這個最低階,但是效率肯定最高,但是哪乙個問題都不能解決。
2.read committed:讀取已經提交的資料 :可以解決髒讀 。
3.repeatable read:重讀讀取:可以解決髒讀 和 不可重複讀 。
4.serializable:序列化:可以解決髒讀不可重複讀和虛讀,效率最差,相當於鎖表,開發中一般不用。
上面的「2」是oracle資料庫預設設定,「3」是mysql資料庫預設的設定。
下面呢我就重點解釋一下mysql資料庫在上面各種事務隔離級別上的演示:
首先介紹兩個語法:
1.檢視mysql資料庫預設的隔離級別:select @@tx_isolation
如圖:
2.設定mysql的隔離級別:set session transaction isolation level 事務的隔離級別
如圖:
注意:如果要自己模擬要開啟兩個mysql客戶端,也就是模擬兩個使用者!
1.read uncommitted
如圖:
我通過語法將資料庫的事務隔離級別改為了read uncommitted。
首先我有一張account表。
如圖:視窗一
視窗二
資料庫表原始資料money都是5000,當我啟動事務後,在zhangsan賬戶增加了1000和在李四賬戶減去了1000,但是我的事務還未提交,但是我再次查詢資料庫表時,資料已經發生變化,這就是髒讀和不可重複讀!
幻讀/虛讀我就不掩飾了,同樣存在!
2.read committed
如圖:
我將資料庫事務隔離性改為了read committted。
還是上面那張表:
如圖:視窗一
視窗二
資料庫表zhangsan賬戶的money和lisi賬戶的money都發生了變化,我未提交事務,在另乙個視窗事務開啟下查詢時,沒有出現髒讀,但是當我提交事務時,在另乙個視窗的事務下再次查詢,出現了不可重複讀的情況,這樣可以避免髒讀,但是查詢時已經出現不可重複讀和幻讀/虛讀!
3.repeatable read
如圖:
我將資料庫事務隔離性改為了read committted。
還是上面那張表:
如圖:視窗一
視窗二
我在兩個視窗都開啟了事務,當視窗一進行資料操作後,並進行事務提交,在視窗二的事務開啟情況下,我去查詢,沒有查詢到剛才視窗一的資料操作記錄,這樣就避免了髒讀和不可重複讀。
有人說也避免了虛讀/幻讀,其實沒有。
看圖:我在操作lisi賬戶時,資料只是發生修改的變化,但是當我修改wangwu這個賬戶時,再去查詢出現了wangwu,賬戶的資料,但是其實在我未操作前,wangwu賬戶的資料是查詢不出的。這就是幻讀/虛讀!
如果不理解幻讀/虛讀這塊,可以查一下innodb。
4.serializable
我就不演示了,開發不建議用,效率又慢,但是所有的問題都能避免!!
總結一下
事務隔離級別的效能:
read uncommitted>read committed>repeatable read>serialazable
事務隔離級別的安全性:
read uncommittedmysql 事務控制:
開啟事務:start transaction;
提交:commit;
回滾:rollback;
資料庫 Mysql事務的簡單剖析
我是真的不想在csdn上面寫部落格了,但看看其他的 唉,我還是回來吧。事務併發產生的問題,事務的隔離級別 指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。然後事務的四大特性也是老生常談了,這我也不說了 然後這幾個特性又是如何實現的,不知道有沒有童鞋想過,涉及到兩個檔案,re...
mysql資料庫事務
維基百科 事務是資料庫管理系統 dbms 執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。只有innodb和ndb 1 原子性 atomicity 事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼全部不執行。2 一致性 consistency 幾個並行執行的事務,其執行結果必須與...
MySQL資料庫事務
文章出處 只有innodb引擎支援事務,下邊的內容均以innodb引擎為預設條件 1 髒讀 2 不可重複讀 3 幻讀 1 讀未提交 read uncommitted 可能產生髒讀 不可重複讀 幻讀 2 讀已提交 read committed 避免了髒讀,可能產生不可重複讀 幻讀 3 可重複讀 rep...