摘要:關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級(jí)別,稍后會(huì)介紹到。這種現(xiàn)象也是正常的,是由于事務(wù)的隔離級(jí)造成的,但是在在某些特別的情況下也是不允許的。指定業(yè)務(wù)方法絕對(duì)不能在事務(wù)范圍內(nèi)執(zhí)行。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響。
總覽:
原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對(duì)數(shù)據(jù)庫有任何影響。
一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。
隔離性(Isolation)
隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
即要達(dá)到這么一種效果:對(duì)于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級(jí)別,稍后會(huì)介紹到。
持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
臟讀
兩個(gè)事務(wù)正在并發(fā)的執(zhí)行,事實(shí)上最后結(jié)果應(yīng)該是1500才對(duì),時(shí)間5時(shí)刻的查詢余額為0就是臟數(shù)據(jù),事務(wù)A讀取了事務(wù)B中未提交的數(shù)據(jù),這就是臟讀。
時(shí)間 | 事務(wù)A | 事務(wù)B |
---|---|---|
1 | 開始事務(wù) | - |
2 | - | 開始事務(wù) |
3 | - | 查詢余額有1000 |
4 | - | 取出1000,余額0 |
5 | 查詢余額0 | - |
6 | - | 撤銷掉事務(wù) |
7 | 存入500,余額500 | - |
8 | 提交事務(wù) | - |
不可重復(fù)讀
兩個(gè)事務(wù)正在并發(fā)的執(zhí)行,結(jié)果A兩次讀取的結(jié)果不一樣,這是因?yàn)閮纱尾樵冇虚g隔,期間被其他事務(wù)修改并提交了事務(wù),相比臟讀的區(qū)別是,不可重復(fù)讀是讀取另一事務(wù)提交的數(shù)據(jù)。這種現(xiàn)象也是正常的,是由于事務(wù)的隔離級(jí)造成的,但是在在某些特別的情況下也是不允許的。
時(shí)間 | 事務(wù)A | 事務(wù)B |
---|---|---|
1 | 開始事務(wù) | - |
2 | - | 開始事務(wù) |
3 | - | 查詢余額有1000 |
4 | 查詢余額1000 | - |
5 | 取出1000,余額0 | |
6 | - | 提交事務(wù) |
7 | 查詢余額0 | - |
幻讀
兩個(gè)事務(wù)正在并發(fā)的執(zhí)行,事務(wù)A第一次統(tǒng)計(jì)和第二統(tǒng)計(jì)的結(jié)果不一樣,是因?yàn)槭聞?wù)B新增了一條數(shù)據(jù),和不可重復(fù)讀一樣,都是讀取了另外一個(gè)事務(wù)的數(shù)據(jù),不同的是不可重復(fù)讀查詢的是同一條數(shù)據(jù),而幻讀則是針對(duì)批量的數(shù)據(jù),或者說不可重復(fù)讀是A讀取了B的更新數(shù)據(jù),幻讀是A讀取了B的新增數(shù)據(jù)。
時(shí)間 | 事務(wù)A | 事務(wù)B |
---|---|---|
1 | 開始事務(wù) | - |
2 | - | 開始事務(wù) |
3 | 統(tǒng)計(jì)總金額10000 | - |
4 | - | - |
5 | 存入100 | |
6 | - | 提交事務(wù) |
7 | 統(tǒng)計(jì)總金額10100 | - |
明白上面的問題之后就明白為什么需要隔離級(jí)別了,不同的隔離級(jí)別能處理不同的并發(fā)事務(wù)問題,下表:
事務(wù)級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻覺讀 |
---|---|---|---|
READ_UNCOMMITTED | 允許 | 允許 | 允許 |
READ_COMMITTED | 禁止 | 允許 | 允許 |
REPEATABLE_READ | 禁止 | 禁止 | 允許 |
SERIALIZABLE | 禁止 | 禁止 | 禁止 |
MySQL默認(rèn)的事務(wù)級(jí)別是REPEATABLE_READ
JDBC的數(shù)據(jù)隔離級(jí)別設(shè)置JDBC | 訪問 | |
---|---|---|
TRANSACTION_READ_UNCOMMITTED | ur | 就是俗稱“臟讀”(dirty read),在沒有提交數(shù)據(jù)時(shí)能夠讀到已經(jīng)更新的數(shù)據(jù) |
TRANSACTION_READ_COMMITTED | cs | 在一個(gè)事務(wù)中進(jìn)行查詢時(shí),允許讀取提交前的數(shù)據(jù),數(shù)據(jù)提交后,當(dāng)前查詢就可以讀取到數(shù)據(jù)。update數(shù)據(jù)時(shí)候并不鎖住表 |
TRANSACTION_REPEATABLE_READ | rs | 在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許讀取其他事務(wù)update的數(shù)據(jù),允許讀取到其他事務(wù)提交的新增數(shù)據(jù) |
TRANSACTION_SERIALIZABLE | rr | 在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許任何對(duì)這個(gè)查詢表的數(shù)據(jù)修改。 |
事務(wù)怎么傳播?方法A傳播到方法B。
Spring解決的就是方法之間的事務(wù)傳播。
下面看下每一種行為具體代表的含義:
業(yè)務(wù)方法需要在一個(gè)事務(wù)中運(yùn)行。如果方法運(yùn)行時(shí),已經(jīng)處在一個(gè)事務(wù)中,那么這個(gè)時(shí)候就會(huì)加入到該事務(wù)中,如果當(dāng)前沒有事務(wù)環(huán)境的話,就會(huì)為自己創(chuàng)建一個(gè)新的事務(wù)。
這一事務(wù)屬性表明,如果業(yè)務(wù)方法A在某個(gè)事務(wù)范圍內(nèi)被調(diào)用,則方法成為事務(wù)的一部分。如果業(yè)務(wù)方法在事務(wù)范圍外被調(diào)用,則方法在沒有事務(wù)的環(huán)境下執(zhí)行。即當(dāng)標(biāo)注了事務(wù)傳播屬性——SUPPORTS的業(yè)務(wù)方法在另一個(gè)bean的業(yè)務(wù)方法中執(zhí)行時(shí),如果另一個(gè)bean的業(yè)務(wù)方法開啟了事務(wù),它就會(huì)處在事務(wù)中執(zhí)行,如果另一個(gè)bean的業(yè)務(wù)方法也沒開啟事務(wù),那么它也在沒有事務(wù)的環(huán)境中進(jìn)行。
該屬性指定業(yè)務(wù)方法只能在一個(gè)已經(jīng)存在的事務(wù)中執(zhí)行,業(yè)務(wù)方法不能發(fā)起自己的事務(wù)。如果業(yè)務(wù)方法在沒有事務(wù)的環(huán)境下調(diào)用,容器就會(huì)拋出異常。一種比較強(qiáng)硬的方式。
該屬性表明不管當(dāng)前是否存在事務(wù),業(yè)務(wù)方法總會(huì)為自己發(fā)起一個(gè)新的事務(wù)。如果方法已經(jīng)運(yùn)行在一個(gè)事務(wù)中,則原有事務(wù)會(huì)被掛起,新的事務(wù)會(huì)被創(chuàng)建,直到方法執(zhí)行結(jié)束,新事務(wù)才算結(jié)束,原先的事務(wù)才會(huì)恢復(fù)執(zhí)行。
聲明方法不需要事務(wù)。如果方法沒有關(guān)聯(lián)到一個(gè)事務(wù),容器不會(huì)為它開啟事務(wù)。如果方法在一個(gè)事務(wù)中被調(diào)用(在其他業(yè)務(wù)bean的方法中被調(diào)用了,而其他業(yè)務(wù)bean的方法是開啟了事務(wù)的),該事務(wù)會(huì)被掛起,在方法調(diào)用結(jié)束后,原先的事務(wù)便會(huì)恢復(fù)執(zhí)行。
指定業(yè)務(wù)方法絕對(duì)不能在事務(wù)范圍內(nèi)執(zhí)行。如果業(yè)務(wù)方法在某個(gè)事務(wù)中執(zhí)行,容器會(huì)拋出異常,只有業(yè)務(wù)方法沒有關(guān)聯(lián)到任何事務(wù),才能正常執(zhí)行。比較強(qiáng)硬的方式,就是不支持事務(wù)。
(嵌套事務(wù))如果一個(gè)活動(dòng)的事務(wù)存在,則當(dāng)前方法運(yùn)行在一個(gè)嵌套的事務(wù)中。 如果沒有活動(dòng)事務(wù),就創(chuàng)建一個(gè)新的事務(wù)。它使用了一個(gè)多帶帶的事務(wù),這個(gè)事務(wù)擁有多個(gè)可以回滾的保存點(diǎn)。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響。外部事務(wù)回滾會(huì)導(dǎo)致內(nèi)部事務(wù)的回滾。如果被調(diào)用的內(nèi)部方法沒有捕獲異常,跑出異常也會(huì)導(dǎo)致外部事務(wù)的回滾。
看下Spring中枚舉定義的7種事務(wù)傳播行為
package org.springframework.transaction.annotation; public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW(3), NOT_SUPPORTED(4), NEVER(5), NESTED(6); private final int value; private Propagation(int value) { this.value = value; } public int value() { return this.value; } }
在使用注解方式的事務(wù)時(shí)候我們可以用下面的方式來設(shè)置事務(wù)的傳播行為
@Transactional(propagation = Propagation.REQUIRED)
是不是很方便。
readOnly屬性:設(shè)置為只讀事務(wù),對(duì)于只讀事務(wù),它就不能進(jìn)行更新操作,一般只存在數(shù)據(jù)讀取的時(shí)候,可以將readOnly屬性設(shè)置為true,可提供效率。
timeout屬性:代表事務(wù)的超時(shí)時(shí)間,默認(rèn)為30s,一般情況下都不需要設(shè)置超時(shí)時(shí)間。如果超過時(shí)間就回滾。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68415.html
摘要:事務(wù)隔離級(jí)別定義了一個(gè)事務(wù)可能受其他并發(fā)事務(wù)影響的程度我們先來看一下并發(fā)事務(wù)帶來的問題,然后再來介紹一下接口中定義了五個(gè)表示隔離級(jí)別的常量。 Java面試通關(guān)手冊(cè)(Java學(xué)習(xí)指南):https://github.com/Snailclimb/Java_Guide 微信閱讀地址鏈接:可能是最漂亮的Spring事務(wù)管理詳解 事務(wù)概念回顧 什么是事務(wù)? 事務(wù)是邏輯上的一組操作,要么都執(zhí)行,...
摘要:中的事務(wù)控制方式編程式事務(wù)管理通過手動(dòng)編碼控制事務(wù)的邊界,可以實(shí)現(xiàn)細(xì)粒度的事務(wù)控制,一般用的較少。隔離級(jí)別控制并發(fā)訪問下數(shù)據(jù)庫的安全性。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響。可能導(dǎo)致臟幻不可重復(fù)讀允許在并發(fā)事務(wù)已經(jīng)提交后讀取。 1.事務(wù)的概念 事務(wù)是一組操作的執(zhí)行單元,相對(duì)于數(shù)據(jù)庫的單條操作而言,事務(wù)管理的是一組SQL指令,如增刪改查等,事務(wù)的特性體現(xiàn)在事務(wù)內(nèi)包含的SQL指令必須全部執(zhí)...
摘要:使用需要使用作為事務(wù)管理器。兩個(gè)事務(wù)互不影響。這是默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級(jí)別下邊的四個(gè)與的隔離級(jí)別相對(duì)應(yīng)這是事務(wù)最低的隔離級(jí)別,它充許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級(jí)別可 Spring事務(wù)整理 工作了幾年了,今天抽時(shí)間整理一下spring的事務(wù),說起spring的事務(wù)是面試的時(shí)候面試官經(jīng)常提及的問題,接下來結(jié)合網(wǎng)上資料再總結(jié)下spring的事務(wù)...
摘要:不同于個(gè)人面經(jīng),這份面經(jīng)具有普適性。我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項(xiàng)目介紹,詳情可以查看這篇文章備戰(zhàn)春招秋招系列初出茅廬的程序員該如何準(zhǔn)備面試。是建立連接時(shí)使用的握手信號(hào)。它表示確認(rèn)發(fā)來的數(shù)據(jù)已經(jīng)接受無誤。 showImg(https://segmentfault.com/img/remote/1460000016972448?w=921&h=532); 該文已加入開源文...
閱讀 1739·2021-09-26 09:46
閱讀 3017·2021-09-22 15:55
閱讀 2608·2019-08-30 14:17
閱讀 3027·2019-08-26 11:59
閱讀 1809·2019-08-26 11:35
閱讀 3155·2019-08-26 10:45
閱讀 3152·2019-08-23 18:28
閱讀 1106·2019-08-23 18:21