併發情況下開啟事務為什麼還會出現髒讀的情況?

時間 2021-06-03 15:43:35

1樓:啊目

跟設定的db事務隔離級別有關係,mysql預設是可重複度(RR),預設隔離級別不會存在髒讀情況,看看是否自己設定過隔離級別,看一下隔離級別。

2樓:浪狼郎

這個錯誤產生的原因,其他大佬解釋的差不多了,我做一些其他解釋,方便你理解理論和實踐當中的一點不同。

不太清楚你用的什麼資料庫,因此不同的資料庫之間有些令人困惑的事情要解釋解釋,你才好理解。

事務有四種隔離級別,但是各個資料庫對這四種隔離級別的實現和理解都是不一樣的。換一種方式說,MySQL的事務,PostgreSQL的事務,SQL標準的事務是四個東西,所以除了泛泛上對事務的理解,在實踐時要根據情況不同加以區分。

MySQL的事務模型

15.7.2.1 Transaction Isolation Levels

PostgreSQL的事務模型

13.2. 事務隔離

2. 對於你遇到的這種錯誤,被稱為更新丟失或者寫丟失,按照事務隔離性的定義,理應被資料庫自動處理。資料庫中自動化處理的技術也有,被稱為自動檢測更新丟失。

打個比方:

事務Aselect

*from

table

whereid=

1;事務Bupdate

table

name

='B'

whereid=

1;commit

;事務A再執行

select

*from

table

whereid=

1for

update;#

或者update

table

name

='A'

whereid=

1;事務A都會產生報錯。

這個功能在PostgreSQL的可重複讀級別提供,而MySQL壓根沒有這個功能(無論什麼事務級別)。究其原因,大家覺得MySQL+鎖也不是不能用,雖然會增加程式設計師的心智負擔。但是PostgreSQL提供的這個功能會讓資料庫報錯,所以也需要程式設計師去做重試邏輯,或者提供給使用者特殊的提示,也沒太方便,因此不廣為人知。

3. MySQL預設的事務級別是Repeatable Read(可重讀),PostgreSQL預設的事務級別是Read Committed(讀取提交內容)。又因為MySQL和PostgreSQL對事務的理解和實現不同(參考第一點),所以在預設的事務級別下,大家都不會因為更新丟失或者寫丟失而報錯。

3樓:大聖歸來

要是用hibernate或其它支援樂觀鎖的框架就可以在開發層避免這類丟失資料問題了。

資料庫層面解決需要事務級別上公升到重複讀。

4樓:

由於寫鎖所以寫會阻塞

由於讀已提交(不知道你的事務隔離級別是什麼,已最常用的來考慮)所以在get時會get到之前已提交的再加一.

關於事務隔離級別:

What is the Transaction Isolation Level? - Definition from Techopedia

徹底搞懂 MySQL 事務的隔離級別-阿里雲開發者社群

A股什麼情況下會出現牛市?

薛丁格 長話短說 牛市的條件需要以下條件 國內外社會經濟形勢好 國際社會穩定,沒有戰亂動盪,或者流行病這一點相信大家已經感受到了,如果不是年初疫情,相信a股已經進入一輪牛市,但疫情打亂正常的經濟社會活動。導致經濟低迷,社會活動停滯。國家政策支援,市場信心充足。經融行業健康發展,沒有債務危機。 不忘初...

白酒什麼情況下會出現絮狀物?

杯酒人生 為什麼純糧食酒會變的渾濁呢?今天我就給大家講一講。其實一般而言,優質醬香酒應該是非常清澈的,但是這是在正常的溫度與濕度的條件下久才能夠清澈透亮,沒有沉澱物和懸浮物的。當溫度降低。白酒也會產生一些相應的化學反應,而在這個化學反應過程中,酒本身會析出不飽和脂肪顆粒,而這種不飽和脂肪顆粒會使酒看...

為什麼極度悲傷的情況下,會出現渾身無力,肌肉痠痛的感覺?

力量散失在極度的悲傷之中,很多事情,很多力量,很多的無奈之下你會幡然醒悟般獲得難得的清醒。之後你會對周圍的一些事物甚至是自己開始有了不同的認識,沉默的並不是爆發的基礎,但爆發之後必定帶來沉默。想不開的,尋找不到了,回不去了,這一切的一切,只要你保持一顆向上的心態,只要你對現在醜陋的骯髒的一切過去會有...