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