看了一下springboot的事物辦理,今天總結一下,記實一下利用的體例,很簡單,一個簡單的注解就可以搞心猿意馬了, @Transactional
顛末測試發現:
(1)若是不加Transactional注解,則對數據庫的操作會當即更新,之后若是拋出異常也不會回滾;申明,默認環境下,是沒有事物的。
(2)若是加上Transactional注解,在數據庫更新語句之后拋出RuntimeException,則會更新不當作功,申明,事物生效了。
(3)一個重點:當利用事物時,呈現了RuntimeException和Error時,則事物會回滾。checked exceptions不會回滾(因為java強制對會拋出checked exceptions的代碼利用try catch;想回滾,可以在catch中拋出前面的異常和錯誤)
(4)下面經由過程源碼簡單的總結Transactional注解的默認設置裝備擺設,及測試的過程。
先看Transactional注解的源碼
(1)源碼注釋中說:當利用了此注解,碰到了RuntimeException和Error時會回滾。checked exceptions不會回滾。
(2)按照Target屬性可知,這個注解可以用于潤色方式、類、接口(包羅注解)、列舉類型;一般環境下,最好用到service層的方式上,一個營業一個事物。
(3)默認的事物傳布機制:REQUIRED。當前沒有事物則開啟一個新的事物;當前有事物則插手到這個已有的事物中。
(4)只讀事物Transactional(readOnly=true):其實一向質疑只讀事務的感化(一向覺著沒啥用),然后網上找了一下都說是因為,統一個營業中對一條數據多次查詢時,有可能這多次查詢的時候距離中該數據被其他用戶點竄,導致前后查詢到的數據紛歧致,想想很有事理;用只讀事物就可以解決這個問題,包管數據的前后一致性。(若是想避免這個問題,也在代碼中只讀一次,避免多次讀)。
然后測試Transactional注解的感化:
(1)不開啟事物,在保留方式中拋出RuntimeException,發現可以保留數據。
(2)開啟事物,在保留方式中拋出RuntimeException,發現此時保留不了數據。
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!