其他分享
首页 > 其他分享> > @Scheduled定时器使用@Transactional事物问题

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

}


标签:Scheduled,事务,定时器,RuntimeException,Transactional,回滚,异常,class
来源: https://www.cnblogs.com/skystarry/p/15572146.html