MySQL事務

一、事務的概念:

什么是"事務":它是數據庫中的概念。它是指一個具體的業務,在數據庫中要多條語句才能完成,例如:

銀行轉賬的業務:張三給李四轉賬1000元;
    1).給張三賬戶減少1000元;
    2).給李四賬戶增加1000元;

這時我們程序至少要發送兩條SQL語句,這樣中間就會有時間差,在這個時間差內如果程序或者數據庫軟件發生問題,而一條SQL已經被執行,再次重啟后,由于只發生了一條修改,第二條沒有被執行,這樣數據的整體就不準確了。

這就要求數據庫軟件必須具有一種能力:將多條SQL語句看成是一個整體,要么全部執行成功;如果有一條失敗,全部失敗,這種處理能力就叫:事務處理

二、獨立操作數據庫軟件來操作事務:

1、查看當前數據庫的"事務處理"方式:
        show variables like 'autocommit';
            查詢結果:
            +---------------+-------+
            | Variable_name | Value |
            +---------------+-------+
            | autocommit    | ON    | 自動提交:開啟(關閉)
            +---------------+-------+

自動提交(開啟):每條SQL語句作為一個獨立的事務,多條SQL語句之間沒有任何關系。
每條SQL發送到服務器會被立即執行。這種情況下,不能滿足我們的需要。

2、操作事務的兩種方式:

A).關閉自動提交:

1).關閉自動提交:
    set autocommit = off;
2).發送SQL語句
    update ....
    delete ....
    insert ....
    select ....
3).提交/回滾
    commit;//提交
    rollback;//回滾

注意:一旦提交,會將這之前所有緩存的SQL語句全部執行,并且立即修改數據庫,到這里,這個事務就算結束,之后再發送的SQL語句就作為另一個事務。
一旦提交后,不能在回滾,一旦回滾后,也不能再提交了。

B).在"自動提交"狀態下,開啟一個"臨時事務"

1).開啟臨時事務:
    start transaction;
2).發送SQL語句:
    update ...
    insert ...
    delete ...
    select ...
3).提交/回滾
    commit;//提交
    rollback;//回滾;

注意:一旦提交/回滾后,這個事務就整體結束,立即恢復到"自動提交"狀態(每條SQL語句都是一個獨立事務)。

三、事務的特性ACID:

1、原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
2、一致性(Consistency)事務前后數據的完整性必須保持一致。
3、隔離性(Isolation)事務的隔離性是指多個用戶并發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所干擾,多個并發事務之間數據要相互隔離。
4、持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

四、事務的并發訪問問題(隔離性)

如果不考慮隔離性,事務存在3種并發訪問問題。

1、臟讀:一個事務讀到了另一個事務未提交的數據.
2、不可重復讀:一個事務讀到了另一個事務已經提交(update)的數據。引發另一個事務,在事務中的多次查詢結果不一致。
3、虛讀 /幻讀:一個事務讀到了另一個事務已經提交(insert)的數據。導致另一個事務,在事務中多次查詢的結果不一致。

解決并發性問題—設置隔離級別:

1.read uncommitted 讀未提交:一個事務讀到另一個事務沒有提交的數據。
?? a)存在:3個問題(臟讀、不可重復讀、虛讀)。
?? b)解決:0個問題
2.read committed 讀已提交:一個事務讀到另一個事務已經提交的數據。
?? a)存在:2個問題(不可重復讀、虛讀)。
?? b)解決:1個問題(臟讀)
3.repeatable read:可重復讀:在一個事務中讀到的數據始終保持一致,無論另一個事務是否提交。
?? a)存在:1個問題(虛讀)(MySQL中也同時解決了虛讀和幻讀)
?? b)解決:2個問題(臟讀、不可重復讀)
4.serializable 串行化:同時只能執行一個事務,相當于事務中的單線程。
?? a)存在:0個問題。
?? b)解決:3個問題(臟讀、不可重復讀、虛讀)

1).查看當前的隔離級別:
    select @@tx_isolation;
2).設置隔離級別:
    set session transaction isolation level 上面的四個隔離級別之一;
3).安全和性能對比
    安全性:serializable > repeatable read > read committed > read uncommitted
    性能 : serializable < repeatable read < read committed < read uncommitted
4).常見數據庫的默認隔離級別:
    MySql:repeatable read
    Oracle:read committed

Spring中,默認的事務隔離級別是數據庫的默認級別,通常是READ COMMITTED。你可以使用@Transactional注解的isolation屬性來指定事務的隔離級別。

三、事務傳播行為(Transaction Propagation)

事務傳播行為用于控制一個事務方法如何與另一個事務方法交互,即當一個事務方法調用另一個事務方法時,應該如何處理事務的傳播。Spring定義了七種不同的事務傳播行為:

1、REQUIRED(默認): 如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是最常用的傳播行為。

2、SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式執行。

3、MANDATORY: 必須在一個已有的事務中執行,否則拋出異常。

4、REQUIRES_NEW: 創建一個新的事務,如果當前存在事務,則將當前事務掛起。

5、NOT_SUPPORTED: 以非事務的方式執行操作,如果當前存在事務,則將當前事務掛起。

6、NEVER: 以非事務的方式執行,如果當前存在事務,則拋出異常。

7、NESTED: 如果當前存在事務,則在嵌套事務內執行。嵌套事務是外部事務的一部分,但是有自己的保存點。它可以獨立地提交或回滾。

事務傳播行為(Transaction Propagation)隔離級別(Isolation Level)是事務管理中兩個重要的概念,它們分別用于控制事務的行為和數據的可見性。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容