一、事務(wù)的概念:
什么是"事務(wù)":它是數(shù)據(jù)庫中的概念关带。它是指一個具體的業(yè)務(wù),在數(shù)據(jù)庫中要多條語句才能完成研儒,例如:
銀行轉(zhuǎn)賬的業(yè)務(wù):張三給李四轉(zhuǎn)賬1000元豫缨;
1).給張三賬戶減少1000元独令;
2).給李四賬戶增加1000元;
這時我們程序至少要發(fā)送兩條SQL語句好芭,這樣中間就會有時間差燃箭,在這個時間差內(nèi)如果程序或者數(shù)據(jù)庫軟件發(fā)生問題,而一條SQL已經(jīng)被執(zhí)行舍败,再次重啟后招狸,由于只發(fā)生了一條修改,第二條沒有被執(zhí)行邻薯,這樣數(shù)據(jù)的整體就不準確了裙戏。
這就要求數(shù)據(jù)庫軟件必須具有一種能力:將多條SQL語句看成是一個整體,要么全部執(zhí)行成功厕诡;如果有一條失敗累榜,全部失敗,這種處理能力就叫:事務(wù)處理灵嫌。
二壹罚、獨立操作數(shù)據(jù)庫軟件來操作事務(wù):
1、查看當前數(shù)據(jù)庫的"事務(wù)處理"方式:
show variables like 'autocommit';
查詢結(jié)果:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON | 自動提交:開啟(關(guān)閉)
+---------------+-------+
自動提交(開啟):每條SQL語句作為一個獨立的事務(wù)寿羞,多條SQL語句之間沒有任何關(guān)系猖凛。
每條SQL發(fā)送到服務(wù)器會被立即執(zhí)行。這種情況下绪穆,不能滿足我們的需要辨泳。
2、操作事務(wù)的兩種方式:
A).關(guān)閉自動提交:
1).關(guān)閉自動提交:
set autocommit = off;
2).發(fā)送SQL語句
update ....
delete ....
insert ....
select ....
3).提交/回滾
commit;//提交
rollback;//回滾
注意:一旦提交玖院,會將這之前所有緩存的SQL語句全部執(zhí)行菠红,并且立即修改數(shù)據(jù)庫,到這里司恳,這個事務(wù)就算結(jié)束途乃,之后再發(fā)送的SQL語句就作為另一個事務(wù)。
一旦提交后扔傅,不能在回滾,一旦回滾后烫饼,也不能再提交了猎塞。
B).在"自動提交"狀態(tài)下,開啟一個"臨時事務(wù)"
1).開啟臨時事務(wù):
start transaction;
2).發(fā)送SQL語句:
update ...
insert ...
delete ...
select ...
3).提交/回滾
commit;//提交
rollback;//回滾杠纵;
注意:一旦提交/回滾后荠耽,這個事務(wù)就整體結(jié)束,立即恢復(fù)到"自動提交"狀態(tài)(每條SQL語句都是一個獨立事務(wù))比藻。
三铝量、事務(wù)的特性ACID:
1倘屹、原子性(Atomicity)原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生慢叨,要么都不發(fā)生纽匙。
2、一致性(Consistency)事務(wù)前后數(shù)據(jù)的完整性必須保持一致拍谐。
3烛缔、隔離性(Isolation)事務(wù)的隔離性是指多個用戶并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事務(wù)不能被其它用戶的事務(wù)所干擾轩拨,多個并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離践瓷。
4、持久性(Durability)持久性是指一個事務(wù)一旦被提交亡蓉,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的晕翠,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。
四砍濒、事務(wù)的并發(fā)訪問問題(隔離性)
如果不考慮隔離性淋肾,事務(wù)存在3種并發(fā)訪問問題。
1梯影、臟讀:一個事務(wù)讀到了另一個事務(wù)未提交的數(shù)據(jù).
2巫员、不可重復(fù)讀:一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交(update)的數(shù)據(jù)。引發(fā)另一個事務(wù)甲棍,在事務(wù)中的多次查詢結(jié)果不一致简识。
3、虛讀 /幻讀:一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交(insert)的數(shù)據(jù)感猛。導(dǎo)致另一個事務(wù)七扰,在事務(wù)中多次查詢的結(jié)果不一致。
解決并發(fā)性問題—設(shè)置隔離級別:
1.read uncommitted 讀未提交:一個事務(wù)讀到另一個事務(wù)沒有提交的數(shù)據(jù)陪白。
?? a)存在:3個問題(臟讀颈走、不可重復(fù)讀、虛讀)咱士。
?? b)解決:0個問題
2.read committed 讀已提交:一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的數(shù)據(jù)立由。
?? a)存在:2個問題(不可重復(fù)讀、虛讀)序厉。
?? b)解決:1個問題(臟讀)
3.repeatable read:可重復(fù)讀:在一個事務(wù)中讀到的數(shù)據(jù)始終保持一致锐膜,無論另一個事務(wù)是否提交。
?? a)存在:1個問題(虛讀)(MySQL中也同時解決了虛讀和幻讀)
?? b)解決:2個問題(臟讀弛房、不可重復(fù)讀)
4.serializable 串行化:同時只能執(zhí)行一個事務(wù)道盏,相當于事務(wù)中的單線程。
?? a)存在:0個問題。
?? b)解決:3個問題(臟讀荷逞、不可重復(fù)讀媒咳、虛讀)
1).查看當前的隔離級別:
select @@tx_isolation;
2).設(shè)置隔離級別:
set session transaction isolation level 上面的四個隔離級別之一;
3).安全和性能對比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
4).常見數(shù)據(jù)庫的默認隔離級別:
MySql:repeatable read
Oracle:read committed
在Spring中,默認的事務(wù)隔離級別是數(shù)據(jù)庫的默認級別种远,通常是READ COMMITTED涩澡。你可以使用@Transactional注解的isolation屬性來指定事務(wù)的隔離級別。
三院促、事務(wù)傳播行為(Transaction Propagation)
事務(wù)傳播行為用于控制一個事務(wù)方法如何與另一個事務(wù)方法交互筏养,即當一個事務(wù)方法調(diào)用另一個事務(wù)方法時,應(yīng)該如何處理事務(wù)的傳播常拓。Spring定義了七種不同的事務(wù)傳播行為:
1渐溶、REQUIRED(默認): 如果當前存在事務(wù),則加入該事務(wù)弄抬;如果當前沒有事務(wù)茎辐,則創(chuàng)建一個新的事務(wù)。這是最常用的傳播行為掂恕。
2拖陆、SUPPORTS: 如果當前存在事務(wù),則加入該事務(wù)懊亡;如果當前沒有事務(wù)依啰,則以非事務(wù)的方式執(zhí)行。
3店枣、MANDATORY: 必須在一個已有的事務(wù)中執(zhí)行速警,否則拋出異常。
4鸯两、REQUIRES_NEW: 創(chuàng)建一個新的事務(wù)闷旧,如果當前存在事務(wù),則將當前事務(wù)掛起钧唐。
5忙灼、NOT_SUPPORTED: 以非事務(wù)的方式執(zhí)行操作,如果當前存在事務(wù)钝侠,則將當前事務(wù)掛起该园。
6、NEVER: 以非事務(wù)的方式執(zhí)行帅韧,如果當前存在事務(wù)爬范,則拋出異常。
7弱匪、NESTED: 如果當前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。嵌套事務(wù)是外部事務(wù)的一部分萧诫,但是有自己的保存點斥难。它可以獨立地提交或回滾。
事務(wù)傳播行為(Transaction Propagation) 和 隔離級別(Isolation Level)是事務(wù)管理中兩個重要的概念帘饶,它們分別用于控制事務(wù)的行為和數(shù)據(jù)的可見性哑诊。