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沒有聲明事務,那就不用事務.

事物超時設置:
@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

髒讀:一個事務讀取到了另外一個事務沒有提交的數據

            事務1:更新一條數據

                             ------------->事務2:讀取事務1更新的記錄

            事務1:調用commit進行提交

            

            ***此時事務2讀取到的數據是保存在數據庫內存中的數據,稱爲髒讀。

            ***讀到的數據爲髒數據

            詳細解釋:

                髒讀就是指:當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,

                另外一個事務也訪問這個數據,然後使用了這個數據。因爲這個數據是還沒有提交的數據,那麼另外一個

                事務讀到的這個數據是髒數據,依據髒數據所做的操作可能是不正確的。

            

不可重複讀:在同一事務中,兩次讀取同一數據,得到內容不同

            事務1:查詢一條記錄

                            -------------->事務2:更新事務1查詢的記錄

                            -------------->事務2:調用commit進行提交

            事務1:再次查詢上次的記錄

            

            ***此時事務1對同一數據查詢了兩次,可得到的內容不同,稱爲不可重複讀

            

幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同

            事務1:查詢表中所有記錄

                              -------------->事務2:插入一條記錄

                              -------------->事務2:調用commit進行提交

            事務1:再次查詢表中所有記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章