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