spring事物管理之傳播行爲和隔離級別

你們在使用spring的註解式事務管理時,對事務的傳播行爲和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。spring

事物註解方式: @Transactionalthis

當標於類前時, 表示類中全部方法都進行事物處理spa

例子:事務

@Transactional
public class TestServiceBean implements TestService {}
get

當類中某些方法不須要事物時:io

@Transactional
public class TestServiceBean implements TestService {
    
    private TestDao dao;
    
    public void setDao(TestDao dao) {
        this.dao = dao;
    }
    
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public List<Object> getAll() {
        return null;
    }
    
}
class

事物傳播行爲介紹: spring事務的傳播行爲說的是當一個方法調用另外一個方法時,事務該如何操做。容器


@Transactional(propagation=Propagation.REQUIRED) 
若是有事務, 那麼加入事務, 沒有的話新建一個(默認狀況下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
容器不爲這個方法開啓事務
@Transactional(propagation=Propagation.REQUIRES_NEW) 
無論是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@Transactional(propagation=Propagation.MANDATORY) 
必須在一個已有的事務中執行,不然拋出異常
@Transactional(propagation=Propagation.NEVER) 
必須在一個沒有的事務中執行,不然拋出異常(與Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) 
若是其餘bean調用這個方法,在其餘bean中聲明事務,那就用事務.若是其餘bean沒有聲明事務,那就不用事務.
List

PROPAGATION_NESTED:
若是當前存在一個事務,則該方法運行在一個嵌套的事務中。被嵌套的事務能夠從當前事務中單獨的提交和回滾。若是當前不存在事務,則開始一個新的事務。各廠商對這種傳播行爲的支持良莠不齊,使用時需注意。方法

事物超時設置:
@Transactional(timeout=30) //默認是30秒

事務隔離級別:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
讀取未提交數據(會出現髒讀, 不可重複讀) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
讀取已提交數據(會出現不可重複讀和幻讀)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重複讀(會出現幻讀)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化

MYSQL: 默認爲REPEATABLE_READ級別
SQLSERVER: 默認爲READ_COMMITTED

髒讀 : 一個事務讀取到另外一事務未提交的更新數據
不可重複讀 : 在同一事務中, 屢次讀取同一數據返回的結果有所不一樣, 換句話說, 
後續讀取能夠讀到另外一事務已提交的更新數據. 相反, "可重複讀"在同一事務中屢次
讀取數據時, 可以保證所讀數據同樣, 也就是後續讀取不能讀到另外一事務已提交的更新數據
幻讀 : 一個事務讀到另外一個事務已提交的insert數據

相關文章
相關標籤/搜索