事務的傳播級別,Spring 的事務隔離級別和傳播特性

 2023-10-08 阅读 20 评论 0

摘要:2019獨角獸企業重金招聘Python工程師標準>>> 今天被人問了一個Oracle 關于事務的簡單問題,結果自己一時間竟然說錯了 ?死了死了的,只能說自己沒有用心去理解這個問題。 事務的傳播級別、 找了一下別人的解釋貼這里更直觀 ---------------------------

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

今天被人問了一個Oracle 關于事務的簡單問題,結果自己一時間竟然說錯了 ?死了死了的,只能說自己沒有用心去理解這個問題。

事務的傳播級別、 找了一下別人的解釋貼這里更直觀

------------------------------------------------------------------------------------------------------------------------------------


臟讀 幻讀 不可重復讀

1, 臟讀

一個事務讀到另一個事務,尚未提交的修改,就是臟讀。這里所謂的修改,除了Update操作,不要忘了,還包括
Insert和Delete操作。

臟讀的后果:如果后一個事務回滾,那么它所做的修改,統統都會被撤銷。前一個事務讀到的數據,就是垃圾數據。


舉個例子:預訂房間。
有一張Reservation表,往表中插入一條記錄,來訂購一個房間。

?事務1:在Reservation表中插入一條記錄,用于預訂99號房間。

?事務2:查詢,尚未預定的房間列表,因為99號房間,已經被事務1預訂。所以不在列表中。

?事務1:信用卡付款。由于付款失敗,導致整個事務回滾。
??????? 所以插入到Reservation 表中的記錄并不置為持久(即它將被刪除)。

現在99號房間則為可用。
所以,事務2所用的是一個無效的房間列表,因為99號房間,已經可用。如果它是最后一個沒有被預定的房間,那么這將是一個嚴重的失誤。

注:臟讀的后果很嚴重。

?

2,不可重復讀。

在同一個事務中,再次讀取數據時【就是你的select操作】,所讀取的數據,和第1次讀取的數據,不一樣了。就是不可重復讀。

舉個例子:
?事務1:查詢有雙人床房間。99號房間,有雙人床。

?事務2:將99號房間,改成單人床房間。

?事務1:再次執行查詢,請求所有雙人床房間列表,99號房間不再列表中了。也就是說,
?????????????? 事務1,可以看到其他事務所做的修改。


在不可重復讀,里面,可以看到其他事務所做的修改,而導致2次的查詢結果不再一樣了。
這里的修改,是提交過的。也可以是沒有提交的,這種情況同時也是臟讀。

如果,數據庫系統的隔離級別。允許,不可重復讀。那么你啟動一個事務,并做一個select查詢操作。
查詢到的數據,就有可能,和你第2次,3次...n次,查詢到的數據不一樣。一般情況下,你只會做一次,select
查詢,并以這一次的查詢數據,作為后續計算的基礎。因為允許出現,不可重復讀。那么任何
時候,查詢到的數據,都有可能被其他事務更新,查詢的結果將是不確定的。


注:如果允許,不可重復讀,你的查詢結果,將是不確定的。一個不確定的結果,你能容忍嗎?


3,幻讀

?

事務1讀取指定的where子句所返回的一些行。然后,事務2插入一個新行,這個新行也滿足事務1使用的查詢
where子句。然后事務1再次使用相同的查詢讀取行,但是現在它看到了事務2剛插入的行。這個行被稱為幻象,
因為對事務1來說,這一行的出現是不可思議的。

舉個例子:
事務1:請求沒有預定的,雙人床房間列表。
事務2:向Reservation表中插入一個新紀錄,以預訂99號房間,并提交。
事務1:再次請求有雙人床的未預定的房間列表,99號房間,不再位于列表中。


注:幻讀,針對的是,Insert操作。如果事務2,插入的記錄,沒有提交。那么同時也是臟讀。

--------------------------------- --------------------------------- --------------------------------- --------------------------------- ---------------------------------

java隔離級別,

Spring在TransactionDefinition接口中定義這些屬性

在TransactionDefinition接口中定義了五個不同的事務隔離級別

什么是事物的隔離級別, ISOLATION_DEFAULT?這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應?

ISOLATION_READ_UNCOMMITTED?這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀

ISOLATION_READ_COMMITTED?保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。

Spring詳解? ISOLATION_REPEATABLE_READ?這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。

ISOLATION_SERIALIZABLE?這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀外,還避免了幻像讀。

?

java事務的隔離級別。 在TransactionDefinition接口中定義了七個事務傳播行為。

PROPAGATION_REQUIRED?如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。

PROPAGATION_SUPPORTS?如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對于事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。

事務傳播特性。 PROPAGATION_MANDATORY?如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。

PROPAGATION_REQUIRES_NEW?總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。

PROPAGATION_NOT_SUPPORTED?總是非事務地執行,并掛起任何存在的事務。

PROPAGATION_NEVER?總是非事務地執行,如果存在一個活動事務,則拋出異常

PROPAGATION_NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

資料鏈接

http://blog.csdn.net/xifeijian/article/details/20313977

轉載于:https://my.oschina.net/u/1156053/blog/144420

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/132649.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息