ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

@Scheduled定时器使用@Transactional事物问题

2021-11-18 14:34:41  阅读:444  来源: 互联网

标签:Scheduled 事务 定时器 RuntimeException Transactional 回滚 异常 class


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有