- @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{
}