1》事務(wù)指的是什么?
? ? ? ?事務(wù)可以看做一個業(yè)務(wù)邏輯處理單元,這個單元要么執(zhí)行,要么不執(zhí)行;
2》acid的原則:
? ? (1)原子性(automicity)
? ? (2)一致性(consistency)
? ? ? ? a 賬戶有3000塊, b 賬戶2000快,
? ? ? ? ? –a –500–》b
? ? ? ? ?a 賬戶和b賬戶總和是5000快
? ? ? ? 事物執(zhí)行之前和執(zhí)行之后,這個總和這個狀態(tài),應(yīng)該一致的。
? ? ?(3)隔離性(lsolation)
? ? ? ? ? a賬戶從3000 里面–》500 –>b賬戶2500
? ? ? ? ? update (1)轉(zhuǎn)賬的事物
? ? ? ? ? ? select sun() a b 之間總和
? ? (4)持久性(durability)
? ? ? ? ? ? 保證持久性:
? ? ? ? ? ? 1>事務(wù)交之前:
? ? ? ? ? ? ? ? 事務(wù)之前將數(shù)據(jù)寫入到磁盤上去了,如果要撤回呢?數(shù)據(jù)從磁盤上撤回?速度很慢?很痛苦?怎么辦?
? ? ? ? ? ? 2>結(jié)合事務(wù)志來完成
? ? ? ? ? ? ? ? 事物日志也是存在磁盤上那么它和數(shù)據(jù)文件存在磁盤上有什么區(qū)別呢?
? ? ? ? ? ? ? ? 區(qū)別:事務(wù)志產(chǎn)生的是順序i/o,而磁盤數(shù)據(jù)文件是隨機i/o 事務(wù)日志每一個操作都是次序?qū)懙酱疟P上一個連續(xù)的存儲塊里面去的,而我們的數(shù)據(jù)文件并非如此。
? ? ? ? ? ? ? ? ? ? (1)事物日志:順序io
? ? ? ? ? ? ? ? ? ? (2)數(shù)據(jù)文件:隨機io
? ? ? ? ? ? ? ? ? ? 將事務(wù)寫入到事務(wù)日志當中,過一會之后事物后臺或者相關(guān)的進程將事務(wù)當中的數(shù)據(jù)重新落地到數(shù)據(jù)文件當中,這樣我們保證事物所操作的數(shù)據(jù)的持久性。
3》事務(wù)的狀態(tài).
? ? (1)要么就是活動事務(wù)
? ? ? ? ? 事務(wù)正在執(zhí)行當中
? ? (2) 部分提交事務(wù)
? ? ? ? ? 我們知道事務(wù)要么執(zhí)行,要么不執(zhí)行,哪什么叫做部分提交呢?
? ? ? ? ? 就是事務(wù)已經(jīng)執(zhí)行,一部分已經(jīng)寫入磁盤,另部分正在執(zhí)行當中,最后一條執(zhí)行語句正在寫的過程當中,我們把它叫做部分提交
? ? (3)失敗的事務(wù)
? ? ? ? ? 事務(wù)正常提交了,但是并沒有達到目的,叫做失敗的事務(wù)
? ? (4)中止的事務(wù)
? ? ? ? ? 中止的是叫做沒有提交,或者走一半就提前結(jié)束了,叫做中止。 ?
? ? (5)提交的事務(wù)
? ? ? ? ? 健康提交完成的事務(wù),我們的事務(wù)一定是存在這5種狀態(tài)中的某一中,事務(wù)一旦提交,就無法在撤銷。
4》事務(wù)的并發(fā)和調(diào)度
? ? ? 事務(wù)的并發(fā):
? ? ? ? ? 1>提高吞吐量和資源利用率
? ? ? ? ? 2>減少等待時間
? ? ? ? ? ? ? ? 事務(wù)之間提交為了降低彼此之間的影響,我們的需要事務(wù)進行隔離,如果隔離呢?這要靠事務(wù)調(diào)度來完成,任何一個數(shù)據(jù)庫系統(tǒng)本身在事務(wù)調(diào)度上都有這復雜 ? ? ? ? ? ?調(diào)度方法集合很多的策略來完成調(diào)度的,一般來講為了保證事務(wù)的隔離性和原子性,他們需要通過事務(wù)調(diào)度來完成,而調(diào)度通常的策略有2種:
? ? ? ?
? ? ? ? ? 事務(wù)調(diào)度:
? ? ? ? ? 1>可恢復調(diào)度
? ? ? ? ? ? ? ? 一般指,兩個事務(wù)在彼此之間調(diào)度的時候,任何兩個事務(wù)的交叉執(zhí)行都不會導致另外一個事務(wù)的狀態(tài)改變,我們把它稱作:可恢復調(diào)度
? ? ? ? ? 2>無級聯(lián)調(diào)度
? ? ? ? ? ? ? ? 可恢復調(diào)度并步意味著事務(wù)的終止結(jié)束之后,他們的彼此之間都沒有任何影響,尤其是在事務(wù)回滾的時候還是會影響,在事務(wù)進行回滾的時候還是會 ? ? ? ? ? ? ? ? ? ? 影響,所以為了避免回滾的時候產(chǎn)生影響還可以實行所謂的叫做:無級聯(lián)調(diào)度。
5》事務(wù)的隔離
? ? ? 我們知道事務(wù)調(diào)度,事務(wù)可能涉及到多個操作,這些操作可以交叉執(zhí)行,事務(wù)調(diào)度的存在就是為了更好調(diào)度次序使得這些交叉執(zhí)行彼此之間不會產(chǎn)生過大的影 ? ? ? ? 響,那么為了進可能降低事務(wù)之間的影響,于是我們有所謂的隔離級別, ?事務(wù)的隔離級別有四個。哪四個?
? ? ? ? ? ?1>讀未提交 read uncommitted
? ? ? ? ? ? ? ? ?在隔離級別,所有事務(wù)都可以看到其它未提交的事務(wù)的執(zhí)行結(jié)果,本隔離級別很少用于實際應(yīng)用,因為它的性能也不比其它的級別好多少,讀取未提交的數(shù) ? ? ? ? ? ? 據(jù),也被成為:臟讀(Dirty Read) ? ?
? ? ? ? ? ?2>讀取提交 read committed
? ? ? ? ? ? ? ? ??大多數(shù)的數(shù)據(jù)庫的默認隔離級別(但是mysql默認級別不是這個),它滿足了隔離的簡單定義:一個事務(wù)只能看到見已經(jīng)提交事務(wù)所做的改變; ? ? ?
? ? ? ? ? ?3>可重讀 ?repeatable read
? ? ? ? ? ? ? ? ? 這是Mysql默認事務(wù)隔離級別,它確保同一個事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行,不過理論上,這導致另外一個問題:幻讀(Phantom ? ? ? ? ? ? ? ? ?read) 簡單的說:幻讀指當作用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)在該范圍內(nèi)插入了新一行,當用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)新的“幻影行”
? ? ? ? ?,Innodb和Falcon引擎通過多版本并發(fā)控制(MVCC)機制解決了該問題。 ? ??
? ? ? ?? 4>可串行 serializable
? ? ? ? ? ? ? 這就最高級別的隔離機制,它通過強制事務(wù)排序,使其步能相互沖突,從而解決了幻讀問題,簡單的說:它是在每個讀數(shù)據(jù)行加上了一個共享鎖,在這個級別, ? ? ? ? ? ?可能導致大量的超時現(xiàn)象和鎖競爭.
? ? ? ? ? ? ? 一般來講我們的并發(fā)控制想要實現(xiàn)隔離級別,就意味我們要基于并發(fā)控制來實現(xiàn),而我們的并發(fā)控制實時
? ? ? ? ? ? ? 技術(shù)依賴于一下幾種技術(shù):
? ? ? ? ? ? ? (1).鎖.讀鎖,寫鎖,獨占鎖,共享鎖.
? ? ? ? ? ? ? (2).時間戳,必須記錄每個事務(wù)的啟動時間和執(zhí)行時間
? ? ? ? ? ? ? (3).多版本和快照隔離
? ? ? ? ? ? ? 額外擴展:
? ? ? ? ? ? ? 事務(wù)的餓死狀態(tài)(鎖饑餓):
? ? ? ? ? ? ? ? 當一個事務(wù)申請一種類型的鎖,為了實現(xiàn)并發(fā)控制,它肯需要這道鎖,但是由于事務(wù)調(diào)度的結(jié)果,導致它一直得不到該鎖,所產(chǎn)生的結(jié)果就是:
? ? ? ? ? ? ? 鎖饑餓。除此之外還有一種鎖叫做:死鎖
6》啟動事務(wù)和回滾
? ? 一般來說啟動事務(wù)的操作:
? ? ? ? 1>啟動事務(wù)
? ? ? ? ? ? ? start transcation ? ? ?
? ? ? ? 2>事務(wù)回滾
? ? ? ? ? ? ? rollback ? ? ? ? ? ?
? ? ? ? 3>提交事務(wù)
? ? ? ? ? ? ? commit
6.1事務(wù)回滾實際操作:
? ? ? ? 1>啟動一個事務(wù)
? ? ? ? ? ? start transaction;
? ? ? ? 2>刪除其中一個student表中的信息
? ? ? ? ? ? delete from student where num=’4′
? ? ? ? 3>如果進行數(shù)據(jù)恢復?事務(wù)回滾。猜對了。
? ? ? ? ? ? rollback;
? ? ? ? 4>查看驗證,4是否恢復回來了?
? ? ? ? ? ? select * from student;
? ? ? ? ? ? 可以;
? ? ??? 6.2 事務(wù)提交之后操作,是否可以在回滾?
? ? ? ? 1>啟動一個事務(wù)
? ? ? ? ? ? start transaction;
? ? ? ? 2>刪除其中一個student表中的信息
? ? ? ? ? ? delete from student where num=’4′
? ? ? ? 3>事務(wù)提交
? ? ? ? ? ? commit;
? ? ? ? 4>再嘗試回滾
? ? ? ? ? ? rollback ?
? ? ? ? 5>驗證數(shù)據(jù)是否可以再重新恢復呢?
? ? ? ? ? ? select * from student;
? ? ? ? ? ? 不可以:
? ? ? ? ?? 6.3 事務(wù)保存savepoint
? ? ? 比如:一個事務(wù)里面有一個百個操作,100個操作語句,我執(zhí)行到第80條的時候,才發(fā)現(xiàn)第75個出錯了執(zhí)行錯了,這個時候是不是要回滾,前80個都撤 ? ? ? ? ? ? ? ? ? 回,這個時候在怎們辦呢? 保存點的作用就出來。比如:我每10個操作保存一次: ? ?
? ? ? —->10(做保存點1)——>20(保存點2)
? ? ? 1>啟動一個事務(wù)
? ? ? ? ? start transaction;
? ? ? 2>刪除其中一個student表中的”翠花”的信息
? ? ? ? ? delete from student where name=’cuihua’
? ? ? ? ? ? ?保存一個事務(wù)點
? ? ? ? ? savepoint yya ? ?
? ? ? 3>刪除其中一個student表中的”西門吹牛”的信息
? ? ? ? ? delete from student where name=’ximenchuiniu’
? ? ? ? ? savepoint yyb ? ?
? ? ? 4>刪除掉其中一個student表的”牛二”的信息
? ? ? ? ? delete from student where name=’niuer’
? ? ? ? ? savepoint yyb ? ?
? ? ? 5>好了開始恢復
? ? ? ? ? 如果想恢復西門吹雪
? ? ? ? ? rollback to yya ?各位思考一下。什么是yya這個保存點呢? ? ? ?
? ? ? 6>查看是否恢復成功
? ? ? ? ? select * from student;
? ? ? ??? 6.3 事務(wù)的自動提交
? ? ? 1>查詢mysql事務(wù)自動提交
? ? ? ? ? ? select @@autocommit;
? ? ? ? ? ? mysql> select @@autocommit;
? ? ? ? ? ? ? ? ? ? ? ? +————–+
? ? ? ? ? ? ? ? ? ? ? ? | @@autocommit |
? ? ? ? ? ? ? ? ? ? ? ? +————–+
? ? ? ? ? ? ? ? ? ? ? ? | ? ? ? ? ? ?1 |
? ? ? ? ? ? ? ? ? ? ? ? +————–+
? ? ? ? ? ? ? ? ? ? ? ? 1 row in set (0.00 sec)
? ? ? 2>修改mysql自動提交
? ? ? ? ? ? set autocommit=0;
? ? ? 3>測試驗證
? ? ? ? ? ? delete from student where name=’ximenchuniu’
? ? ? ? ? ? rollback;
? ? ? ? ? ?是否恢復回來?而且我們沒有明確啟動一個事務(wù)把?事務(wù)支持DML語句回滾.DDL為隱試提交,所以很遺憾不支持。
?? 驗證讀未提交:
? ? ? ? 查詢隔離級別 select @@tx_isolation;
? ? ? ? 更改隔離級別 set tx_isolation=’read_uncommittd ‘;
? ? ? ? 一個mysql,開兩個窗口,雙方交叉啟動一個事務(wù)
? ?窗口一窗口二共同的操作:
? ? ? ? ? 1.select @@tx_isolation;
? ? ? ? ? 2.set tx_isolation=’read_uncommittd ‘;
? ? ? 窗口1操作:
? ? ? ? ? 1.start ?transaction; 啟動一個交叉的事務(wù)
? ? ? ? ? ? 2.update student set age=’70’ ?where d_id=’1010′;
? 窗口2操作
? ? ? ? ? ? 1.start ?transaction; 啟動一個交叉的事務(wù)
? ? ? ? ? ? 2.select * from student; 可以看到1窗口變更age為70,1窗口事務(wù)未提交,被2看到了,稱作臟讀 ? ? ?
? ?驗證讀提交
? ? ? ? ? 一個mysql,開兩個窗口,雙方交叉啟動一個事務(wù)
? 窗口1和窗口2共同的操作:
? ? ? ? ? 1.select @@tx_isolation;
? ? ? ? ? 2.set tx_isolation=’read_committd ‘;
? ? ? ? ? 窗口1操作:
? ? ? ? ? 1.start ?transaction;啟動一個交叉的事務(wù)
? ? ? ? ? 2.update student set age=’70’ ?where d_id=’1010′;
? ? ? ? ? 3.commit; 只有這里提交了,在2窗口第三步驟才會重新看到所提交的數(shù)據(jù)
? ? ? ? ? 窗口2操作
? ? ? ? ? 1.start ?transaction; 啟動一個交叉的事務(wù)
? ? ? ? ? 2.select * from student; ? 未看到1窗口所更新數(shù)據(jù)
? ? ? ? ? 3.select * from student; ? 當A窗口執(zhí)行了3步提交后,才能看到更新數(shù) 據(jù),避免臟讀 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? 驗證可重讀
? ? ? ? ? 一個mysql,開兩個窗口,雙方交叉啟動一個事務(wù)
? ?幻影讀:
? ? ? ? ? 定義:同一個事務(wù)T1,在兩個不同的時間段,比如1 2執(zhí)行同一天查詢語句得到記錄數(shù)量都不同稱為幻影讀
? ? ? ? ? 窗口1和窗口2共同的操作:
? ? ? ? ? 1.select @@tx_isolation;
? ? ? ? ? 2.set tx_isolation=’repeatable-read ‘;
? ? ? ? ? 窗口1操作
? ? ? ? ? 1.start ?transaction;啟動一個交叉的事務(wù)
? ? ? ? ? 2.update ?student set age=’60’ where num=’10’;
? ? ? ? ? 3.commit;
? ? ? ? ? 窗口2操作
? ? ? ? ? 1.start ?transaction; 啟動一個交叉的事務(wù)
? ? ? ? ? 2.select * from student; ? 未看到1窗口所更新數(shù)據(jù)
? ? ? ? ? 3.select * from student; ? 1commit;后依舊未看到1窗口所更新數(shù)據(jù)
? ? ? ? ? 4.commit; ? ?2窗口提交后才可看到1窗口索更新數(shù)據(jù)
? ?? 驗證可串行
? ? ? ? ? ? 一個mysql,開兩個窗口,雙方交叉啟動一個事務(wù)
? ? ? ? ? ? 窗口1和窗口2共同的操作:
? ? ? ? ? ? 1.select @@tx_isolation;
? ? ? ? ? ? 2.set tx_isolation=’serializable’;
? ? ? ? ? ? 窗口1操作
? ? ? ? ? ? 1.start ?transaction;啟動一個交叉的事務(wù)
? ? ? ? ? ? 2.update ?student set age=’60’ where num=’10’; 不能執(zhí)行,只有等2窗口2提交操作之后,才能執(zhí)行!
? ? ? ? ? ? 窗口2操作
? ? ? ? ? ? 1.start ?transaction; 啟動一個交叉的事務(wù)
? ? ? ? ? ? 2.commit; ?這里提交了,1窗口的update 方能執(zhí)行成功。這個就是可串行!
? ? ? ? ? ? 原因:
? ? ? ? ? ? 兩個事務(wù)在同時交叉執(zhí)行修改同一個數(shù)據(jù),一方必須先提交。否則讀寫會相互阻塞。