同一事务多次加for_谈谈事务隔离级别,以及悲观锁和乐观锁的原理和应用场景...
前言
在日常開發中,數據庫我想大家一點都不陌生是吧,我想不管你寫啥,數據庫就算沒用過你也聽說過吧。做好數據方面的操作,不僅僅需要對Java相關框架的掌握,還需要對數據庫自身體系結構的理解。
本文是補充Java面試考察知識點的完整性,更多的關于數據庫的應用和細節還需要大家在實踐中深入學習。
正文
給我講一下什么是事務?
事務(Transaction)是并發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。
舉個例子,比如在銀行中的轉賬業務,從一個賬戶中扣款并使另一個賬戶增款,這兩個操作要么都執行,要么都不執行,這就可以看作一個事務。
你知道數據事務的生命周期嗎?能在紙上給我大致畫一下嗎?
能給我談談MySQL支持的事務隔離級別嗎?
所謂隔離級別(Isolation Level),就是在數據庫事務中,為保證并發數據讀寫的正確性而提出的定義。
每種關系型數據庫都提供了各自特色的隔離級別實現,雖然在通常的定義中是以鎖為實現單 元,但實際的實現千差萬別。以最常見的 MySQL InnoDB 引擎為例,它是基于 MVCC(Multi-Versioning Concurrency Control)和鎖的復合實現,MVCC就是同一份數據臨時保留多版本的一種方式,進而實現并發控制。
按照隔離程度從低到高,MySQL 事務隔離級別分為四個不同層次:
Read uncommitted:讀未提交,就是一個事務能夠看到其他事務尚未提交的修改, 這是最低的隔離水平(會造成幻讀、臟讀、不可重復讀)。
Read committed:讀已提交,事務能夠看到的數據都是其他事務已經提交的修改,也就是保證不會看到任何中間性狀態,允許其他事務并發修改數據(會造成幻讀、不可重復讀)。
Repeatable reads:可重復讀,保證同一個事務中多次讀取的數據是一致的,這是 MySQL InnoDB 引擎的默認隔離級別(會造成幻讀)。
Serializable:串行化,并發事務之間是串行化的,通常意味著讀取需要獲取共享讀鎖,更新需要獲取排他寫鎖,如果 SQL 使用 WHERE 語句,還會獲取區間鎖(MySQL 以 GAP 鎖形式實現,這是最高的隔離級別(該級別能防止幻讀、臟讀、不可重復讀)。
好的,那你說一下什么是幻讀、臟讀、不可重復讀?
臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數據。比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然后另一個事務嘗試讀取到了記錄 A。
不可重復讀 :是指在一個事務內,多次讀同一數據。
幻讀 :指同一個事務內多次查詢返回的結果集不一樣。比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的原因也是另外一個事務新增或者刪除或者修改了第一個事務結果集里面的數據,同一個記錄的數據內容被修改了,所有數據行的記錄就變多或者變少了。
給我講解一下悲觀鎖和樂觀鎖,以及應用?
在操作共享數據時,“悲觀鎖”認為數據出現沖突的可能性更大, 而“樂觀鎖”則是認為大部分情況不會出現沖突,進而決定是否采取排他性措施。
數據庫應用開發中,悲觀鎖一般就是利用類似 SELECT ... FOR UPDATE 這 樣的語句,對數據加鎖,避免其他事務意外修改數據。
樂觀鎖則與 Java 并發包中的 AtomicFieldUpdater 類似,也是利用 CAS 機制,并不會對數據加鎖,而是通過對比數據的時間戳或者版本號,來實現樂觀鎖需要的版本判斷。
你可以再給我說一下有關它們的應用場景嗎?
舉個例子,以買火車票為例子,火車票面對廣大用戶,每個人都可以查詢余票數量以及購票,雖然具體一個座位票只能賣給一個人,但是余票很多,而且不能知道哪個查詢火車票的用戶會購票,這個時候更適合用樂觀鎖。再比如處于購票高峰期時,有很多用戶同時搶購同一張票的情況,為了避免出現一張火車票被多個用戶購票成功,當第一個用戶進入購票流程,就將數據庫鎖定,讓別的用戶無法修改,只有當第一個用戶購票成功或取消購票后,才會講出數據庫鎖定,此時別的用戶就可繼續操作,這可看作悲觀鎖場景。
樂觀鎖適用于寫比較少的情況下(多讀場景),一般多寫的場景下用悲觀鎖就比較合適。
可以的小伙子,這一塊還是了解的很清楚的,下次我們再深入了解數據庫的其他知識。
好的,下次見。
總結
在這里,我基本上把事務隔離級別,以及悲觀鎖和樂觀鎖的原理和應用場景的都聊了一下,其實里面還有很多比較細節的東西,以及需要深入了解的知識,我只是講了一些常見的知識。
當然,我自己在數據庫方面還做不到非常深入了解的地步,后面有機會的話一定要深入了解去學習一些。
總結
以上是生活随笔為你收集整理的同一事务多次加for_谈谈事务隔离级别,以及悲观锁和乐观锁的原理和应用场景...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印象笔记电脑版使用技巧_高效技巧 | 一
- 下一篇: python中locals函数_Pyth