臟讀:當一個事務讀取另一個事務未提交的內容,之后由於另一個事務出現了異常回滾了事務,結果造成讀取的數據不一致
不可重復讀:指一個事務多次讀取同一數據,而另一個事務多次對數據進行了修改的操作,這樣就導致了第一個事務每次讀取的數據不一樣,
幻讀:當事務一對整張表的數據進行操作時對其進行了新增行,而另一個事務對其進行了刪除行,而這時事務一本身對其進行了新增行然而發現並沒有對其新增行而產生了幻覺
臟讀與不可重復讀的區別:臟讀是對沒有提交的數據進行查詢,不可重復讀是對已經提交的數據進行的查詢
不可重復讀與幻讀的區別:不可重復讀針對的時update操作,幻讀一般是insert和delete操作
事務的隔離級別就是用來解決臟讀、不可重復讀和幻讀問題
事務的隔離級別一般有四種(spring提供了五種):
1.DEFAULT 默認使用數據庫的隔離級別
2.READ_UNCOMMITTED 能讀取還未提交的事務,不能解決臟讀、不可重復度和幻讀
3.READ_COMMITTED 只能讀取已經提交的事務,能解決臟讀,不能解決不可重復讀和幻讀,一般使用此隔離級別
4.REPEATABLE_READ 當一個事務讀取這個數據時會對其進行加鎖處理,防止其他事務對數據進行修改。重復讀取(REPEATABLE_READ)的意思,讀取了一條數據,這個事務不結束,別的事務就不可以改這條記錄,這樣就解決了臟讀、不可重復讀的問題,但是幻讀的問題還是無法解決
5.SERLALIZABLE 串行化,最高的事務隔離級別,不管多少事務,挨個運行完一個事務的所有子事務之后才可以執行另外一個事務里面的所有子事務,這樣就解決了臟讀、不可重復讀和幻讀的問題了
事務的傳播特性:指的就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行。
一共有七種傳播行為:
1.PROPAGATION_REQUIRED 如果當前方法存在一個事務,則將該方法置於同一個事物中,如果之前不存在事務,則另新開啟一個事物(delete ,insert update)
2.PROPAGATION_SUPPORTS 如果當前方法存在一個事務,則將該方法置於同一個事物中,如果之前不存在事務,則進行非事務執行(select)
3.PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
4.PROPAGATION_REQUIRES_NEW 使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作為事務管理器。
它會開啟一個新的事務。如果一個事務已經存在,則先將這個存在的事務掛起。
5.PROPAGATION_NOT_SUPPORTED PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作為事務管理器。
6.PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常。
7.PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中。 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行