spring對於事務異常的處理
//unchecked 運行期Exception spring默認會進行事務回滾 比如:RuntimeException
//checked 用戶Exception spring默認不會進行事務回滾 比如:Exception
如何改變spring的這種默認事務行爲?可以通過在方法上
添加@Transactional(noRollbackFor=RuntimeException.class)讓spring對於RuntimeException不回滾事務
添加@Transactional(RollbackFor=Exception.class)讓spring對於Exception進行事務的回滾
@Transactional(propagation=Propagation.REQUIRED)
required爲默認行爲
如果只是內部的try/catch塊出現異常只會導致內部try/catch塊的事務的回滾,則內部try/catch塊的操作不會被執行,但是另外的操作任然會執行。
而如果外部出現異常則會導致整個事務的回滾,那麼所有的操作都不會被執行,即使內部try/catch塊沒有出現異常。
@Transactional(readOnly=true)
只讀屬性,不允許進行更新操作,可以提高效率
@Transactional(timeout=30)
超時,默認爲30秒
@Transactional(isolation=Isolation.REPEATABLE_READ)
事務隔離級別
MYSQL默認爲第三種級別REPEATABLE_READ
MSSQLSERVER2000默認爲第二種級別READ_COMMITTED
MSSQLSERVER2005可以設爲第二三種級別而且效率不會比第二種級別差
級別越高,效率越低
事物內部新起異步方法,會導致出現異常時異步方法內的數據庫操作行爲不回滾,因此事物內部儘量少使用異步方法