一.什麼是事務
定義:數據庫執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。
本質:由一個或多個sql語句組成。這些sql語句在執行過程當中被看成一個總體,要麼所有的sql語句執行成功,要麼所有失敗。不存在一部分執行成功,一部分執行失敗。mysql
二.數據庫中事務的有四大特性(ACID)
(1)原子性(Atomic,或稱不可分割性)
將事務中進行的操做捆綁成一個不可分割的單元。事務中進行的數據操做,要麼所有失敗,要麼所有成功。
(2)一致性(Consistency)、
一個事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,即事務開始前和完成後,數據都處於一致性狀態。
example:A用戶和B用戶進行轉帳1000元,A帳戶減小1000和B帳戶增長1000的sql語句必須所有執行成功,不存在通常成功,通常失敗。
可是不管如何執行,兩個帳戶金額的改變加起來必定1000元,這就是一致性。
(3)隔離性(Isolation,又稱獨立性)
多個用戶併發訪問數據庫,好比同時操做一張表。數據庫爲每個用戶開啓事務。每一個事務相互獨立,互不干擾。
(4)持久性(Durability)
一個事務完成後,對數據庫的修改時永久的。其餘操做和故障都不會對其有任何影響sql
在實際應用中,數據庫的事務有兩種,讀事務(select),修改事務(update,insert)。在沒有事務控制的時候,多個用戶同時操做相同的數據時,可能會產生併發問題,基本上歸結爲4中問題。
1)兩個更新事務同時修改一條數據時,會形成數據的丟失。
2)髒讀 :一個更新事務更新一條數據時,另外一個讀取事務讀取了未提交的更新,這種狀況下會出現髒數據。
3)不可重複讀:一個讀取事務讀取一條數據時,另外一個更新事務修改了這條數據。致使讀取事務再次讀取時,數據發生了修改。形成不可重複讀。
4)幻讀/虛讀:一個讀取事務讀取時,一個更新事務插入了一條新的數據,當讀取事務再次讀取時和以前的讀取結果不一致,會形成幻讀。
以上4中狀況,前三種都是對同一條數據進行併發操做,對程序的結果會產生致命影響。第四種不會形成數據真實性的問題。能夠按照轉帳實例來理解4種問題,這裏就不詳細解釋了。數據庫
三.事務的隔離級別。
1)Read Uncommitted (讀未提交)
若是一個事務A已經開始寫數據,則另外一個事務B不容許寫操做。可是能夠讀取這個事務A修改但未提交的數據。
2) Read Committed (讀已提交)
事務A只能讀取事務B修改而且提交後的數據行,禁止訪問事務B處於寫狀態的數據行。能夠避免髒讀。
3)Repeatable Read(可重複讀取)
事務A在讀取數據行時,禁止其餘事務對該數據行進行更改,可是能夠進行讀取操做。進行寫操做時,禁止其餘事務的任何操做。能夠防止髒讀和不可重複讀。
4) Serializable (可串行化)
提供嚴格的隔離級別,要求事務一個個的執行。不能併發執行。有效的防止髒讀,不可重複讀,幻讀。併發
四.mysql和oracle的區別
1)mysql支持4中隔離級別,且自動提交,其中默認的隔離級別是repeatable read。
2)在mysql中查看當前的隔離級別,select @@tx_isolation;
3)在mysql中設置數據庫的隔離級別,set tx_isolation='隔離級別名稱',必定要在開啓事務以前,設置隔離級別。
若是經過jdbc設置事務的隔離級別,也要在開啓事務代碼前,寫上隔離級別代碼。
4)oracle支持兩種隔離級別(read committed,serializable),須要手動提交,默認的隔離級別是read committedoracle