原子性是指事務包含的所有操作要么全部成功,要么全部失敗。
例小王要向小李轉賬200元。則賬要么轉賬成功小王賬戶減200元,小李賬戶加200元,要么執行失敗,兩者賬戶都不動。
目前創新互聯建站已為千余家的企業提供了網站建設、域名、網頁空間、網站改版維護、企業網站設計、成縣網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
一致性是指事務執行之前和執行之后都必須處于一致性狀態。
假設轉賬前小王和小李的余額之和是2000元,那么不管他們之間進行了多少次轉賬,他們的余額之和肯定還是2000元。
隔離性是當多個事務并發操作數據庫時,不能被其他事務的操作所干擾
例小王銀行卡只有200元了,他要向小李轉賬200元時銀行方面進行銀行卡的年費扣除則這兩個操作必定不可能都成功。
持久性是指一個事務一旦提交,那么對數據庫中的數據的改變就是永久性的。
當小王和小李之間進行一次轉賬時,這筆轉賬記錄便永久的保存在數據庫里.
上方提到了數據庫事務的隔離性,先看一下如果事務之間不進行隔離的話可能出現什么問題
臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。
當一個事務正在多次修改某個數據,而在這個事務中這多次的修改都還未提交,這時一個并發的事務來訪問該數據,就會造成兩個事務得到的數據不一致。同上方的例子:小王向小李轉賬200元,對應SQL命令如下
update account set balance=balance+200 where name=’小李’;
update account set balance=balance-200 where name=’小王’;
當只執行第一條SQL時,小李查詢余額發現確實錢已到賬(此時即發生了臟讀),而之后如果該事務不提交或者出現異常,則所有操作都將回滾,那么小李再次查看賬戶時就會發現錢其實并沒有到賬。
例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據并且提交事務給數據庫,事務T1再次讀取該數據就得到了不同的結果,這個時候就發生了不可重復讀。
例如事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”并且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。
幻讀和不可重復讀都是讀取了另一條已經提交的事務,所不同的是不可重復讀查詢的是同一個數據項,而幻讀針對的是一批數據。
上方隔離級別從低到高,隔離級別越高效率越低。
在MySQL數據庫中,支持上面四種隔離級別,默認為Repeatable read
在Oracle數據庫中,只支持Serializable和Read committed ,默認為Read committed級別
針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。
?
本文標題:淺談數據庫事務
標題網址:http://vcdvsql.cn/article0/gjidoo.html
成都網站建設公司_創新互聯,為您提供域名注冊、網站營銷、定制開發、面包屑導航、商城網站、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯