数据库事务及锁机制介绍
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
事務(wù)介紹
因?yàn)橐恢笔褂肧pring這種聲明式的事務(wù)管理,一直以為事務(wù)的主要作用是對(duì)一個(gè)業(yè)務(wù)方法中多次執(zhí)行數(shù)據(jù)庫操作的最終提交。近期重新了解了下事務(wù),有了新的認(rèn)識(shí)。數(shù)據(jù)庫事務(wù)除了有異?;貪L的功能,更重要的是控制數(shù)據(jù)表的共享數(shù)據(jù)。
首先數(shù)據(jù)庫事務(wù)需要滿足四個(gè)特性ACID,原子性、一致性、隔離性、持久性。數(shù)據(jù)一致性是最終目標(biāo),其他特性都是為達(dá)到該目的的措施。
和Java程序采用對(duì)象鎖機(jī)制進(jìn)行線程同步類似,數(shù)據(jù)庫管理系統(tǒng)采用數(shù)據(jù)庫鎖機(jī)制保證事務(wù)的隔離性。當(dāng)多個(gè)事務(wù)試圖對(duì)相同的數(shù)據(jù)進(jìn)行操作時(shí),只有持有鎖的事務(wù)才能操作數(shù)據(jù)。
通常數(shù)據(jù)并發(fā)會(huì)造成3類數(shù)據(jù)讀問題(臟讀,不可重復(fù)讀,幻想讀)以及2類數(shù)據(jù)更新問題(第一類丟失更新和第二類丟失更新)
1、臟讀(dirty read):A事務(wù)讀取B事務(wù)尚未提交的更改數(shù)據(jù),并在這個(gè)數(shù)據(jù)的基礎(chǔ)上操作。如果恰巧B事務(wù)回滾,那么A事務(wù)讀到的數(shù)據(jù)根本是不被承認(rèn)的。
在這個(gè)場(chǎng)景中,B希望取款500元而后又撤銷了動(dòng)作,而A往相同的賬戶中轉(zhuǎn)了100元,因?yàn)锳讀了B未提交的事務(wù),并且最后修改了金額,造成賬戶白白丟失了500元。在oracle中使用數(shù)據(jù)版本機(jī)制,不會(huì)發(fā)生臟讀的情況。
2、不可重復(fù)讀(unrepeatable read):A事務(wù)讀取了B事務(wù)已經(jīng)提交的更改數(shù)據(jù)。即A事務(wù)讀取多次數(shù)據(jù),但是讀取的過程中,B事務(wù)可能修改了金額,造成A事務(wù)每次讀取的數(shù)據(jù)可能不一致。
3、幻象讀(phantom read):A事務(wù)讀取B事務(wù)提交的新增數(shù)據(jù),這時(shí)A事務(wù)將出現(xiàn)幻想讀的問題。假設(shè)銀行系統(tǒng)在同一個(gè)事務(wù)中,兩次統(tǒng)計(jì)存款賬戶的總金額,在兩次統(tǒng)計(jì)的過程中,剛好新增了一個(gè)賬戶,并存款100元,這時(shí)兩次統(tǒng)計(jì)的總金額不一致。
幻象讀和不可重復(fù)讀的區(qū)別是,幻象讀是發(fā)生在新增數(shù)據(jù)的時(shí)候,不可重復(fù)讀發(fā)生在修改數(shù)據(jù)的時(shí)候。兩種情況采取的對(duì)策不一樣,不可重復(fù)讀只要對(duì)操作的數(shù)據(jù)添加行級(jí)鎖,阻止操作中的數(shù)據(jù)發(fā)生變化,而幻象讀,要防止新增數(shù)據(jù),往往需要添加表級(jí)鎖,將整個(gè)表鎖定,防止新增數(shù)據(jù)(oracle使用多版本的數(shù)據(jù)方式實(shí)現(xiàn))。
4、第一類丟失更新:A事務(wù)撤銷時(shí),把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。這種錯(cuò)誤很嚴(yán)重,如下
5、第二類丟失更新:A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做操作丟失。
這種情況銀行會(huì)有損失,感覺還是蠻好的。
數(shù)據(jù)庫鎖機(jī)制
數(shù)據(jù)庫的鎖按鎖定的對(duì)象不同,可以分為表鎖定和行鎖定。按并發(fā)事務(wù)鎖定的關(guān)系,可以分為共享鎖定和獨(dú)占鎖定。共享鎖定會(huì)防止獨(dú)占鎖定,但允許其他的共享鎖定。獨(dú)占鎖定既防止其他的獨(dú)占鎖定,也防止其他的共享鎖定。為了更改數(shù)據(jù),數(shù)據(jù)庫必須在進(jìn)行更改的行上施加行獨(dú)占鎖定,insert、update、delete、select for update語句都會(huì)隱士采用必要的行鎖定。
如下是oracle常用的5中鎖定
1、行共享鎖定:一般通過select for update 語句隱式獲得。行共享鎖定并不防止對(duì)數(shù)據(jù)行進(jìn)行更改的操作,但是可以防止其他會(huì)話獲取獨(dú)占性數(shù)據(jù)表鎖定。允許進(jìn)行多個(gè)并發(fā)的行共享和行獨(dú)占性鎖定,還允許進(jìn)行數(shù)據(jù)表的共享或者采用共享行獨(dú)占鎖定。
2、行獨(dú)占鎖定:通過一條insert、update、delete語句隱士獲取,或者通過一條LOCK TABLE ROW EXCLUSIVE MODE語句顯示獲取。這個(gè)鎖可以防止其他會(huì)話獲取一個(gè)共享鎖定,共享行獨(dú)占鎖定或獨(dú)占鎖定。
3、表共享鎖定:通過LOCK TABLE IN SHARE MODE語句顯示獲得,這種鎖定可以防止其他會(huì)話獲取行獨(dú)占鎖定(insert,update,delete),或者防止其他表共享行獨(dú)占鎖定或表獨(dú)占鎖定,它允許在表中擁有多個(gè)行共享和表共享鎖定,該鎖定可以讓會(huì)話具有對(duì)表事務(wù)級(jí)一致性訪問,因?yàn)槠渌麜?huì)話在用戶提交或者回溯該事務(wù)并釋放對(duì)該表的鎖定之前不能更改這個(gè)被鎖定的表。
4、表共享行獨(dú)占鎖定:通過 LOCK TABLE IN SHARE ROW EXCLUSIVE MODE語句顯示獲得。這種鎖定可以防止其他會(huì)話獲取一個(gè)表共享、行獨(dú)占或者表獨(dú)占鎖定,它允許其他行共享鎖定,它允許其他行共享鎖定。這種鎖定類似于表共享鎖定,只是一次只能對(duì)一個(gè)表放置一個(gè)表共享行獨(dú)占鎖定。如果A會(huì)話擁有該鎖定,則B會(huì)話可以執(zhí)行select for update操作,但如果B會(huì)話試圖更新選擇的行,則需要等待。
5、表獨(dú)占:通過LOCK TABLE IN EXCLUSIVE MODE顯示獲得。這個(gè)鎖定防止其他會(huì)話對(duì)該表的任何鎖定。
事務(wù)隔離級(jí)別
因?yàn)橹苯邮褂脭?shù)據(jù)的鎖比較麻煩,用戶可以設(shè)置事務(wù)的隔離級(jí)別來實(shí)現(xiàn)自動(dòng)鎖機(jī)制。通過設(shè)置事務(wù)的隔離級(jí)別,數(shù)據(jù)庫就會(huì)分析事務(wù)中的SQL語句,然后自動(dòng)為事務(wù)操作的數(shù)據(jù)資源加上適合的鎖。
轉(zhuǎn)載于:https://my.oschina.net/everyDay111/blog/602052
總結(jié)
以上是生活随笔為你收集整理的数据库事务及锁机制介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataGrid方法标注
- 下一篇: linux cmake编译源码,linu