本地事物的简介
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
此章帶大家回顧下本地事物的一些內(nèi)容。標(biāo)題 2
事物:
有一組操作構(gòu)成的可靠,獨(dú)立的工作單元----百度百科
事物的四大特性:
A:原子性(Atomicity)事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,事務(wù)中包括的諸操作要么全做,要么全不做。 B:一致性(Consistency)事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。一致性與原子性是密切相關(guān)的。 C:隔離性(Isolation)一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。 D:持續(xù)性/永久性(Durability)一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的。以上介紹完事務(wù)的四大特性(簡(jiǎn)稱ACID),現(xiàn)在重點(diǎn)來說明下事務(wù)的隔離性,當(dāng)多個(gè)線程都開啟事務(wù)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)要能進(jìn)行隔離操作,以保證各個(gè)線程獲取數(shù)據(jù)的準(zhǔn)確性,在介紹數(shù)據(jù)庫(kù)提供的各種隔離級(jí)別之前,我們先看看如果不考慮事務(wù)的隔離性,會(huì)發(fā)生的幾種問題:
不可重復(fù)讀
不可重復(fù)讀的重點(diǎn)是修改:
同樣的條件,?你讀取過的數(shù)據(jù),?再次讀取出來發(fā)現(xiàn)值不一樣了
例子:
在事務(wù)1中,Mary 讀取了自己的工資為1000,操作并沒有完成?
con1?=?getConnection();?? select?salary?from?employee?empId?="Mary";??在事務(wù)2中,這時(shí)財(cái)務(wù)人員修改了Mary的工資為2000,并提交了事務(wù).?
con2?=?getConnection();?? update?employee?set?salary?=?2000;?? con2.commit();??在事務(wù)1中,Mary 再次讀取自己的工資時(shí),工資變?yōu)榱?000?
//con1?? select?salary?from?employee?empId?="Mary";??
在一個(gè)事務(wù)中前后兩次讀取的結(jié)果并不致,導(dǎo)致了不可重復(fù)讀。
?
?
幻讀
幻讀的重點(diǎn)在于新增或者刪除
同樣的條件,?第1次和第2次讀出來的記錄數(shù)不一樣
例子:
目前工資為1000的員工有10人。?
事務(wù)1,讀取所有工資為1000的員工。?
共讀取10條記錄?
這時(shí)另一個(gè)事務(wù)向employee表插入了一條員工記錄,工資也為1000?
事務(wù)1再次讀取所有工資為1000的員工?
共讀取到了11條記錄,這就產(chǎn)生了幻像讀。?
?
事物的隔離級(jí)別:
現(xiàn)在來看看MySQL數(shù)據(jù)庫(kù)為我們提供的四種隔離級(jí)別:
① Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。
② Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
③ Read committed (讀已提交):可避免臟讀的發(fā)生。
④ Read uncommitted (讀未提交):最低級(jí)別,任何情況都無法保證。
以上四種隔離級(jí)別最高的是Serializable級(jí)別,最低的是Read uncommitted級(jí)別,當(dāng)然級(jí)別越高,執(zhí)行效率就越低。像Serializable這樣的級(jí)別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時(shí)選用何種隔離級(jí)別應(yīng)該根據(jù)實(shí)際情況。在MySQL數(shù)據(jù)庫(kù)中默認(rèn)的隔離級(jí)別為Repeatable read (可重復(fù)讀)。
在MySQL數(shù)據(jù)庫(kù)中,支持上面四種隔離級(jí)別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫(kù)中,只支持Serializable (串行化)級(jí)別和Read committed (讀已提交)這兩種級(jí)別,其中默認(rèn)的為Read committed級(jí)別。
在MySQL數(shù)據(jù)庫(kù)中查看當(dāng)前事務(wù)的隔離級(jí)別:
select @@tx_isolation;在MySQL數(shù)據(jù)庫(kù)中設(shè)置事務(wù)的隔離 級(jí)別:
set [glogal | session] transaction isolation level 隔離級(jí)別名稱;set tx_isolation=’隔離級(jí)別名稱;’?
?
本地事物的局限性:
如何修復(fù)事物的局限性解決微服務(wù)問題?
? ? 1:單數(shù)據(jù)源局限性思考
? ??既然一個(gè)事物只能操作一個(gè)數(shù)據(jù)源,那么我們能否新建多個(gè)事物,分別操作多個(gè)數(shù)據(jù)源,最后通過一個(gè)統(tǒng)一的”事物管理器”進(jìn)行統(tǒng)一管理以及提交呢?
? ? 2:單進(jìn)程局限性思考
既然一個(gè)事物只能對(duì)一個(gè)線程進(jìn)行管理,那么我們能否新建多個(gè)事物,分別操作多個(gè)線程,最后通過一個(gè)統(tǒng)一的”事物管理器”進(jìn)行統(tǒng)一管理以及提交呢?
? 3:高并發(fā)下效率低局限性思考
?既然事物執(zhí)行效率低,那么能否把事物的執(zhí)行丟到一個(gè)異步線程里面執(zhí)行,這樣主線程就不會(huì)受事物的影響了。
那就帶著,我們自己思考的解決方案,正式進(jìn)入分布式方案的講解吧。
?
?/**
* ??————————如果覺得本博文還行,別忘了推薦一下哦,謝謝!
* ??作者:寫程序的奧特曼
* ??歡迎轉(zhuǎn)載,請(qǐng)保留此段聲明。
* ??出處:https://my.oschina.net/u/2286631/blog/1504647
*/
轉(zhuǎn)載于:https://my.oschina.net/u/2286631/blog/1504647
總結(jié)
- 上一篇: OpenStack —— DevStac
- 下一篇: Flask+uwsgi+Nginx环境搭