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