@Scheduled定時器使用@Transactional事物問題


  • @Scheduled和@Thransaction不能在同一個類中。
    並且實體類要加上@EnableTransactionManagement注解,使我們這個工程支持事務
  • Spring的默認的事務規則是遇到運行異常(RuntimeException)和程序錯誤(Error)才會回滾。
    如果想針對非檢測異常進行事務回滾,可以在@Transactional 注解里使用,@Transactional(rollbackFor=xxxException.class) 明確指定異常。

事務管理

// 在連接數據庫也就是date jpa 工程的啟動類中 配置
@Bean(name="transactionManager")
public PlatformTransactuibManager configurationTm(EntityManagerFactory factory){
	return new JpaTransactionManager(factory);
}

package com.wt.basics.system.service;

import com.wt.basics.system.exception.SysException;
import org.springframework.transaction.annotation.Transactional;


/**
 * 事務隔離級別isolation:
 * @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數據(會出現臟讀, 不可重復讀) 基本不使用
 * @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數據(會出現不可重復讀和幻讀)
 * @Transactional(isolation = Isolation.REPEATABLE_READ):可重復讀(會出現幻讀)
 * @Transactional(isolation = Isolation.SERIALIZABLE):串行化
 *
 * 事物傳播行為propagation:
 * @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沒有聲明事務,那就不用事務.
 * timeout:該屬性用於設置事務的超時秒數,默認值為-1表示永不超時
 * readOnly:該屬性用於設置當前事務是否為只讀事務,設置為true表示只讀,false則表示可讀寫,默認值為false。例如:@Transactional(readOnly=true)
 *
 * rollbackFor/rollbackForClassName:
 * 該屬性用於設置需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,則進行事務回滾。例如:
 * 指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
 * 指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
 *
 * 該屬性用於設置需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾。例如:
 * 指定單一異常類名稱:@Transactional(rollbackForClassName="RuntimeException")
 * 指定多個異常類名稱:@Transactional(rollbackForClassName={"RuntimeException","Exception"})
 *
 * noRollbackFor/noRollbackForClassName:
 * 該屬性用於設置不需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,不進行事務回滾。例如:
 * 指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)
 * 指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
 *
 *
 * @Transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能
 *
 */
@Transactional(rollbackFor= SysException.class)
public class TxService extends TService{

}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM